升级IE8后,VS出现ParameterType.Value.length为空或不是对象(Line:842)的解决办法

升级IE8后-ParameterType.Value.length为空或不是对象(Line:842)的解决办法

今天难得在家用了下VS2008,跑出个问题来:

症状就是安装了IE8以后,右键Class->Add Functions/Variables。

出现错误:

'ParameterType.Value.length'为空或不是对象(Line:842)

看看是IE8的安全设置问题,应该是C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\VsWizard.dll 这个文件的ActiveX控件在web browser control中加载不成功,被ie8的安全属性设置禁止了。解决方法如下:

启动注册表编辑器 regedit

找到“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet

Settings\Zones”, 建立一个名为1000的新键(如果没有的话).

在这个1000的键下,建立如下DWORD内容:

Name = 1207

Type = REG_DWORD

Data = 0x000000

或者直接写注册表

REGEDIT4

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1000]
@=""
"1207"=dword:00000000

难得写篇技术文章,自己折腾了很久,希望别人不折腾

PS:学得越多,就觉得自己要学的越多!

原文地址:http://www.fantasyray.com/lbs/article.asp?id=270

-------------------------------------------

自己写了个注册表文件,上传到了资源里了,http://download.youkuaiyun.com/source/1378893,下载后"右键"->"合并",重启VS即可。

其实也就是把下面几句放到记事本里,然后保存一个后缀是.reg的文件,合并就行了。

REGEDIT4

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1000]
@=""
"1207"=dword:00000000

import arcpy import os import collections class Toolbox(object): def __init__(self): """定义工具箱名称""" self.label = "界址点线提取工具" self.alias = "" self.tools = [ExtractBoundaryPointsAndLines] class ExtractBoundaryPointsAndLines(object): def __init__(self): """初始化工具""" self.label = "提取界址点和界址线" self.description = "从输入面要素中提取所有界址点(不重复)和界址线(考虑洞)" self.canRunInBackground = False def getParameterInfo(self): """定义参数""" params = [] # 输入面要素参数 input_polygon = arcpy.Parameter( name="input_polygon", displayName="输入面要素", datatype="DEFeatureClass", parameterType="Required", direction="Input") input_polygon.filter.list = ["Polygon"] params.append(input_polygon) # 输出点要素参数 output_points = arcpy.Parameter( name="output_points", displayName="输出界址点要素", datatype="DEFeatureClass", parameterType="Required", direction="Output") params.append(output_points) # 输出线要素参数 output_lines = arcpy.Parameter( name="output_lines", displayName="输出界址线要素", datatype="DEFeatureClass", parameterType="Required", direction="Output") params.append(output_lines) # 唯一ID字段参数(可选) id_field = arcpy.Parameter( name="id_field", displayName="唯一标识字段(可选)", datatype="Field", parameterType="Optional", direction="Input") id_field.parameterDependencies = [input_polygon.name] params.append(id_field) return params def isLicensed(self): """设置工具是否可用""" return True def updateParameters(self, parameters): """根据用户输入动态修改参数""" return def updateMessages(self, parameters): """自定义消息""" return def execute(self, parameters, messages): """执行工具""" try: # 获取参数 input_polygon = parameters[0].valueAsText output_points = parameters[1].valueAsText output_lines = parameters[2].valueAsText id_field = parameters[3].valueAsText if parameters[3].value else None # 创建输出要素类 spatial_ref = arcpy.Describe(input_polygon).spatialReference # 创建界址点要素类 arcpy.CreateFeatureclass_management( out_path=os.path.dirname(output_points), out_name=os.path.basename(output_points), geometry_type="POINT", spatial_reference=spatial_ref) # 创建界址线要素类 arcpy.CreateFeatureclass_management( out_path=os.path.dirname(output_lines), out_name=os.path.basename(output_lines), geometry_type="POLYLINE", spatial_reference=spatial_ref) # 添加字段到界址点要素类 arcpy.AddField_management(output_points, "JID", "TEXT", field_length=20) # 界址点编号 arcpy.AddField_management(output_points, "X", "DOUBLE") # X坐标 arcpy.AddField_management(output_points, "Y", "DOUBLE") # Y坐标 if id_field: arcpy.AddField_management(output_points, "POLY_ID", "TEXT", field_length=50) # 面要素ID # 添加字段到界址线要素类 arcpy.AddField_management(output_lines, "LINE_ID", "TEXT", field_length=20) # 界址线编号 if id_field: arcpy.AddField_management(output_lines, "POLY_ID", "TEXT", field_length=50) # 面要素ID arcpy.AddField_management(output_lines, "IS_HOLE", "SHORT") # 是否为洞边界 # 定义字段列表 point_fields = ["SHAPE@", "JID", "X", "Y"] line_fields = ["SHAPE@", "LINE_ID"] if id_field: point_fields.append("POLY_ID") line_fields.append("POLY_ID") line_fields.append("IS_HOLE") # 使用字典存储所有点,确保不重复 all_points = collections.OrderedDict() point_counter = 1 # 创建插入游标 with arcpy.da.InsertCursor(output_points, point_fields) as point_cursor, \ arcpy.da.InsertCursor(output_lines, line_fields) as line_cursor: # 使用搜索游标遍历输入面要素 with arcpy.da.SearchCursor(input_polygon, ["SHAPE@", id_field] if id_field else ["SHAPE@"]) as poly_cursor: for row in poly_cursor: polygon = row[0] fid = row[1] if id_field else None # 处理外边界和洞 part_index = 0 for part in polygon: # 创建线要素的顶点数组 line_array = arcpy.Array() part_points = [] # 遍历当前部分的每个点 for pnt in part: if pnt: # 检查点是否已存在 point_key = (round(pnt.X, 6), round(pnt.Y, 6)) if point_key not in all_points: all_points[point_key] = { "point": pnt, "jid": f"J{point_counter}", "x": pnt.X, "y": pnt.Y } point_counter += 1 # 添加点到线数组 line_array.add(pnt) part_points.append(pnt) # 创建线几何对象 if len(part_points) > 1: line = arcpy.Polyline(line_array) # 准备线要素记录 line_record = [line, f"L{part_index+1}"] if id_field: line_record.append(fid) line_record.append(1 if part_index > 0 else 0) # 0=外边界, 1=洞 # 插入线要素 line_cursor.insertRow(line_record) part_index += 1 # 插入所有不重复的点 for point_data in all_points.values(): point_record = [ arcpy.PointGeometry(point_data["point"]), point_data["jid"], point_data["x"], point_data["y"] ] if id_field: point_record.append(None) # 面要素ID在点要素中不适用 point_cursor.insertRow(point_record) arcpy.AddMessage("界址点和界址线提取完成!") except Exception as e: arcpy.AddError(f"处理过程中出错: {str(e)}") raise e if __name__ == "__main__": # 测试代码 tool = ExtractBoundaryPointsAndLines() tool.execute(tool.getParameterInfo(), None) 优化错误
最新发布
06-24
<think>嗯,用户提供的这段代码看起来是关于参数赋值的,特别是涉及到一个类型为ParameterType.PARAMETER_INTEGER的参数。用户觉得这样的写法有些多此一举,可能想知道为什么需要中间步骤而不是直接赋值。我需要先理解每一行代码的作用,然后解释其必要性。 首先,代码中的new_rcolor_value.type被设置为ParameterType.PARAMETER_INTEGER。这可能意味着new_rcolor_value是一个参数对象,需要指定其类型为整数。接着,new_rcolor_value.integer_value被赋值为r_value,这里可能是将整数值存储到该参数中。最后,r.value被设置为这个新创建的参数对象。 用户可能疑惑为什么不直接使用r.value = r_value。这里的关键可能在于参数对象的类型系统。如果r.value期望接收的是一个特定类型的参数对象(比如包含类型信息和一个值),而不仅仅是原始整数,那么直接赋值可能不符合类型要求。例如,某些API框架要求参数必须附带类型信息,以确保类型安全和数据结构的正确性。 接下来要考虑的是ParameterType.PARAMETER_INTEGER的作用。可能这个参数对象需要明确知道存储的是整数、浮点数还是其他类型,以便后续处理时能够正确解析。如果直接赋值原始值,系统可能无法自动推断类型,者在内部需要进行额外的类型检查,而显式指定类型可以避免潜在的错误。 此外,可能存在数据封装的需求。参数对象可能包含更多的元数据方法,而不仅仅是值本身。例如,验证逻辑、序列化方法其他业务逻辑可能依赖于参数的类型信息。直接使用原始类型无法携带这些额外的信息,因此需要通过创建参数对象来封装。 另一个可能的因素是框架库的设计。某些框架强制要求参数必须通过特定的对象来传递,以确保一致性和扩展性。例如,如果未来需要支持更多类型的参数,现有的设计可以更容易地扩展,而不需要修改所有赋值的地方。 还需要考虑类型安全和编译时检查。如果使用静态类型语言,如JavaC#,参数对象的不同类型可能在编译时进行检查,防止类型错误。而直接使用原始值可能会绕过这些检查,导致运行时错误。 用户可能没有意识到参数对象的设计意图,认为直接赋值更简洁。但通过创建参数实例并设置类型和值,代码遵循了特定的设计模式框架规范,确保了系统的健壮性和可维护性。 最后,可能需要举例说明如果没有这样的设计会导致什么问题。例如,如果r.value直接接受整数,当传入一个字符串浮点数时,系统可能在运行时才报错,而通过参数对象明确类型,可以在赋值时就确保类型正确,提前捕获错误。 总结来说,这种写法是为了确保类型明确、数据封装、符合框架设计以及增强类型安全性,避免潜在的错误,尽管看起来多了一步,但实际是必要的设计考虑。</think>关于这段代码为何需要分步设置参数值,这里做一个逐步解释: 1. **参数系统的类型约束**: - 假设`r.value`属性要求接收的是`Parameter`类型的对象(包含类型标记和实际值) - 直接赋值原始值`r.value = r_value`会导致类型不匹配错误,因为整数≠参数对象 2. **创建参数容器**: ```python new_rcolor_value = Parameter() # 创建参数容器 ``` 这个中间对象用于承载类型元数据和实际值 3. **设置类型标识**: ```python new_rcolor_value.type = ParameterType.PARAMETER_INTEGER ``` 显式声明这是一个整型参数,后续处理程序可通过此标识: - 执行类型验证 - 选择正确的序列化方式 - 调用对应数据处理方法 4. **存储实际数值**: ```python new_rcolor_value.integer_value = r_value ``` 这里体现了强类型设计: - 如果尝试赋值字符串到`integer_value`字段,运行时立即报错 - 避免将错误类型存入`value`通用字段后的隐蔽错误 5. **完成参数传递**: ```python r.value = new_rcolor_value ``` 此时接收方可以通过检查`.type`字段: - 快速确认参数类型 - 安全地从`integer_value`字段取值 **类比理解**:就像邮寄包裹需要先装箱贴标签(创建容器→标记类型→放入物品),不能直接把物品扔到快递车上。 **直接赋值的风险**示例: ```python # 如果设计为 r.value = 123(原始值) r.value = "255" # 字符串类型错误可能在后续处理中才暴露 ``` 通过参数对象包装后,赋值时立即暴露错误: ```python new_rcolor_value.integer_value = "255" # 立即触发类型错误 ``` 这种设计模式在以下场景特别必要: - 需要支持多种参数类型(整数/浮点/字符串) - 参数需要附加元数据(如单位、校验规则) - 跨系统数据交换时需要明确类型声明 因此虽然看似冗余,实则为保证系统健壮性的必要设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值