Convert.ToString 方法 (Boolean, IFormatProvider)

本文介绍了CultureInfo类及其相关类,如DateTimeFormatInfo和NumberFormatInfo的作用。CultureInfo类保存了有关特定区域性的信息,包括语言、国家/地区、日历及格式化规则等,并提供了对日期和数字格式化信息的访问。
实现 IFormatProvider 的类
说明
CultureInfo表示有关特定区域性的信息,包括区域性的名称、书写体系和使用的日历,以及有关对常用操作(如格式化日期和排序字符串)提供信息的区域性特定对象的访问。
DateTimeFormatInfo定义如何根据区域性设置 DateTime 值的格式并显示这些值。
NumberFormatInfo根据区域性定义如何设置数值格式以及如何显示数值。
 

CultureInfo 类保存区域性特定的信息,如关联的语言、子语言、国家/地区、日历和区域性约定。此类还提供对 DateTimeFormatInfoNumberFormatInfoCompareInfoTextInfo 的区域性特定实例的访问。这些对象包含区域性特定操作(如大小写、格式化日期和数字以及比较字符串)所需的信息。

String 类间接地使用此类来获取有关默认区域性的信息。

区域性名称遵循 RFC 1766 标准,格式为“<languagecode2>-<country/regioncode2>”,其中 <languagecode2> 是从 ISO 639-1 派生的由两个小写字母构成的代码,<country/regioncode2> 是从 ISO 3166 派生的由两个大写字母构成的代码。例如,美国英语为“en-US”。在双字母语言代码不可用的情况中,将使用从 ISO 639-2 派生的三字母代码;例如,三字母代码“div”用于使用 Dhivehi 语言的区域。某些区域性名称带有指定书写符号的后缀;例如“-Cyrl”指定西里尔语书写符号,“-Latn”指定拉丁语书写符号。

此类和 System.Globalization 命名空间中的其他类接受并使用下列预定义的 CultureInfo 名称和标识符。

 

using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; using System; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Windows.Forms; using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application; namespace BeamSectionPlugin { public class BeamSectionDrawer { private static BeamSettings settings = new BeamSettings(); private static readonly HashSet<string> loadedDatabases = new HashSet<string>(); private static Point3d? lastBeamEnd = null; private static double? lastSlabZ = null; [CommandMethod("DB")] public void DrawBeamSection() { Document doc = AcadApp.DocumentManager.MdiActiveDocument; if (doc == null) return; Editor ed = doc.Editor; Database db = doc.Database; // 加载设置窗体 DialogResult dialogResult; using (var form = new SettingsForm(settings)) { dialogResult = AcadApp.ShowModalDialog(form); } if (dialogResult != DialogResult.OK) return; // 保存原始系统变量设置 int oldOrthoMode = Convert.ToInt32(AcadApp.GetSystemVariable("ORTHOMODE")); int oldPolarMode = Convert.ToInt32(AcadApp.GetSystemVariable("POLARMODE")); int oldPolarAddMode = Convert.ToInt32(AcadApp.GetSystemVariable("POLARADDANG")); try { // 启用正交模式和极轴追踪 AcadApp.SetSystemVariable("ORTHOMODE", 1); AcadApp.SetSystemVariable("POLARMODE", 1); // 启用极轴追踪 AcadApp.SetSystemVariable("POLARADDANG", 90); // 设置90度增量角 // 重置连续绘制状态 lastBeamEnd = null; lastSlabZ = null; while (true) { try { Point3d firstPoint; // 步骤1: 获取梁的第一点 if (lastBeamEnd.HasValue) { string continuePrompt = "\n请点击梁的第一点 (或按回车从上一端点继续): "; PromptPointOptions firstPointOpts = new PromptPointOptions(continuePrompt); firstPointOpts.AllowNone = true; PromptPointResult firstPointRes = ed.GetPoint(firstPointOpts); if (firstPointRes.Status == PromptStatus.None) { // 用户按回车,使用上一端点 firstPoint = lastBeamEnd.Value; } else if (firstPointRes.Status == PromptStatus.OK) { firstPoint = firstPointRes.Value; } else { return; // 用户取消 } } else { PromptPointResult firstPointRes = ed.GetPoint("\n请点击梁的第一点: "); if (firstPointRes.Status != PromptStatus.OK) return; firstPoint = firstPointRes.Value; } // 步骤2: 获取梁的第二点 Point3d secondPoint; if (!lastBeamEnd.HasValue) // 第一次绘制 { PromptPointResult secondPointRes = ed.GetPoint("\n请点击梁的第二点: "); if (secondPointRes.Status != PromptStatus.OK) return; secondPoint = secondPointRes.Value; } else // 连续绘制 { PromptPointOptions secondPointOpts = new PromptPointOptions("\n请点击梁的第二点[板厚(A)升降板(S)]: "); secondPointOpts.Keywords.Add("A"); secondPointOpts.Keywords.Add("S"); secondPointOpts.AllowNone = true; secondPointOpts.UseBasePoint = true; secondPointOpts.BasePoint = firstPoint; secondPointOpts.UseDashedLine = true; PromptPointResult secondPointRes = ed.GetPoint(secondPointOpts); while (secondPointRes.Status == PromptStatus.Keyword) { if (secondPointRes.StringResult == "A") { PromptDoubleOptions pdo = new PromptDoubleOptions("\n输入板厚(mm)<" + settings.SlabThickness.ToString() + ">: "); pdo.DefaultValue = settings.SlabThickness; pdo.UseDefaultValue = true; PromptDoubleResult slabThicknessRes = ed.GetDouble(pdo); if (slabThicknessRes.Status != PromptStatus.OK) return; settings.SlabThickness = slabThicknessRes.Value; } else if (secondPointRes.StringResult == "S") { PromptDoubleOptions pdo = new PromptDoubleOptions("\n请输入升降板高度(升板为正数,降板为负数)mm<" + settings.SlabHeightOffset.ToString() + ">: "); pdo.DefaultValue = settings.SlabHeightOffset; pdo.UseDefaultValue = true; PromptDoubleResult slabHeightRes = ed.GetDouble(pdo); if (slabHeightRes.Status != PromptStatus.OK) return; settings.SlabHeightOffset = slabHeightRes.Value; } secondPointRes = ed.GetPoint(secondPointOpts); } if (secondPointRes.Status != PromptStatus.OK) return; secondPoint = secondPointRes.Value; } // 确保两点不在同一位置 if (firstPoint.DistanceTo(secondPoint) < 0.001) { ed.WriteMessage("\n错误: 两点位置相同,请重新选择"); continue; } // 步骤3: 获取梁高 PromptDoubleOptions heightOpts = new PromptDoubleOptions("\n请输入梁高(mm)<" + settings.BeamHeight.ToString() + ">: "); heightOpts.DefaultValue = settings.BeamHeight; heightOpts.UseDefaultValue = true; heightOpts.AllowNegative = false; heightOpts.AllowZero = false; PromptDoubleResult beamHeightRes = ed.GetDouble(heightOpts); if (beamHeightRes.Status != PromptStatus.OK) return; double beamHeight = beamHeightRes.Value; settings.BeamHeight = beamHeight; // 计算板底高度 double slabZ = firstPoint.Z + beamHeight + settings.SlabThickness + settings.SlabHeightOffset; // 处理连续绘制时的板底高度变化 if (lastSlabZ.HasValue && Math.Abs(slabZ - lastSlabZ.Value) > 0.001) { // 绘制升降板竖线 DrawVerticalLine(db, lastBeamEnd.Value, lastSlabZ.Value, slabZ); } // 预加载所需块 LoadSupportBlocks(db, new[] { "ScaffoldPole梁侧模", "ScaffoldPole断面木方", "ScaffoldPole断面方钢", "ScaffoldPole横向龙骨" }); // 步骤4: 绘制梁侧模 if (settings.DrawBeamFormwork) DrawBeamFormwork(db, ed, firstPoint, secondPoint, beamHeight); // 传递ed对象 // 步骤5: 绘制板底线 DrawSlabLine(db, firstPoint, secondPoint, beamHeight); // 步骤6: 如果是连续绘制,绘制板下龙骨 if (lastBeamEnd.HasValue && settings.DrawSlabSupport) { DrawSlabSupport(db, firstPoint, secondPoint, beamHeight); } // 更新连续绘制状态 lastBeamEnd = secondPoint; lastSlabZ = slabZ; } catch (System.Exception ex) { ed.WriteMessage($"\n错误: {ex.Message}\n{ex.StackTrace}"); string dbKey = db.Filename ?? db.GetHashCode().ToString(); loadedDatabases.Remove(dbKey); } } } finally { // 恢复原始系统变量设置 AcadApp.SetSystemVariable("ORTHOMODE", oldOrthoMode); AcadApp.SetSystemVariable("POLARMODE", oldPolarMode); AcadApp.SetSystemVariable("POLARADDANG", oldPolarAddMode); } } private void DrawVerticalLine(Database db, Point3d startPoint, double startZ, double endZ) { using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); Line verticalLine = new Line( new Point3d(startPoint.X, startPoint.Y, startZ), new Point3d(startPoint.X, startPoint.Y, endZ) ); btr.AppendEntity(verticalLine); tr.AddNewlyCreatedDBObject(verticalLine, true); tr.Commit(); } } private void DrawSlabLine(Database db, Point3d beamStart, Point3d beamEnd, double beamHeight) { using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); // 计算板底高度 double slabZ = beamStart.Z + beamHeight + settings.SlabThickness + settings.SlabHeightOffset; Line slabLine = new Line( new Point3d(beamStart.X, beamStart.Y, slabZ), new Point3d(beamEnd.X, beamEnd.Y, slabZ) ); btr.AppendEntity(slabLine); tr.AddNewlyCreatedDBObject(slabLine, true); tr.Commit(); } } private void LoadSupportBlocks(Database db, IEnumerable<string> requiredBlocks) { string dbKey = db.Filename ?? db.GetHashCode().ToString(); if (loadedDatabases.Contains(dbKey)) return; // 1. 尝试加载合并的块文件 string blockFilePath = FindBlockFile(); if (!string.IsNullOrEmpty(blockFilePath)) { using (Database sourceDb = new Database(false, true)) { sourceDb.ReadDwgFile(blockFilePath, FileOpenMode.OpenForReadAndAllShare, false, null); using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); foreach (string blockName in requiredBlocks) { if (!bt.Has(blockName)) { // 复制块定义 db.Insert(blockName, sourceDb, true); } } tr.Commit(); } } loadedDatabases.Add(dbKey); return; } // 2. 如果找不到合并文件,尝试加载单个块文件 string currentDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string blockDir = Path.Combine(currentDir, "ScaffoldBlocks"); if (!Directory.Exists(blockDir)) { // 尝试在父目录中查找 blockDir = Path.Combine(Directory.GetParent(currentDir).FullName, "ScaffoldBlocks"); if (!Directory.Exists(blockDir)) { loadedDatabases.Add(dbKey); throw new FileNotFoundException("支撑块定义文件未找到,请确认ScaffoldBlocks目录存在"); } } using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); foreach (string blockName in requiredBlocks) { if (bt.Has(blockName)) continue; string blockFile = Path.Combine(blockDir, blockName + ".dwg"); if (!File.Exists(blockFile)) { throw new FileNotFoundException($"找不到图块文件: {blockFile}"); } using (Database sourceDb = new Database(false, true)) { sourceDb.ReadDwgFile(blockFile, FileOpenMode.OpenForReadAndAllShare, false, null); db.Insert(blockName, sourceDb, true); } } tr.Commit(); } loadedDatabases.Add(dbKey); } private string FindBlockFile() { string currentDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); // 1. 检查ScaffoldBlocks子目录 string blockFile = Path.Combine(currentDir, "ScaffoldBlocks", "ScaffoldBlocks.dwg"); if (File.Exists(blockFile)) return blockFile; // 2. 检查当前目录 blockFile = Path.Combine(currentDir, "ScaffoldBlocks.dwg"); if (File.Exists(blockFile)) return blockFile; // 3. 安全获取AutoCAD支持路径 string acadPaths = ""; try { if (AcadApp.MainWindow != null) { object supportVar = AcadApp.GetSystemVariable("SUPPORT"); if (supportVar != null) acadPaths = supportVar.ToString(); } } catch { acadPaths = ""; } // 4. 检查所有支持路径 if (!string.IsNullOrEmpty(acadPaths)) { char[] separators = new char[] { ';', ',' }; foreach (string path in acadPaths.Split(separators, StringSplitOptions.RemoveEmptyEntries)) { try { // 检查路径根目录 blockFile = Path.Combine(path.Trim(), "ScaffoldBlocks.dwg"); if (File.Exists(blockFile)) return blockFile; // 检查路径下的ScaffoldBlocks子目录 blockFile = Path.Combine(path.Trim(), "ScaffoldBlocks", "ScaffoldBlocks.dwg"); if (File.Exists(blockFile)) return blockFile; } catch { /* 忽略无效路径 */ } } } // 5. 检查标准插件目录 string[] pluginPaths = new string[] { Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Autodesk", "ApplicationPlugins", "BeamSectionPlugin.bundle"), Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Autodesk", "ApplicationPlugins", "BeamSectionPlugin.bundle") }; foreach (string pluginDir in pluginPaths) { try { // 检查插件目录 blockFile = Path.Combine(pluginDir, "ScaffoldBlocks.dwg"); if (File.Exists(blockFile)) return blockFile; // 检查插件目录下的ScaffoldBlocks子目录 blockFile = Path.Combine(pluginDir, "ScaffoldBlocks", "ScaffoldBlocks.dwg"); if (File.Exists(blockFile)) return blockFile; } catch { /* 忽略异常 */ } } // 6. 最终检查程序集所在目录的子目录 try { blockFile = Path.Combine(currentDir, "Resources", "ScaffoldBlocks.dwg"); if (File.Exists(blockFile)) return blockFile; blockFile = Path.Combine(currentDir, "Resources", "ScaffoldBlocks", "ScaffoldBlocks.dwg"); if (File.Exists(blockFile)) return blockFile; } catch { } return null; } // 修改方法签名,添加Editor参数 private void DrawBeamFormwork(Database db, Editor ed, Point3d start, Point3d end, double beamHeight) { double length = start.DistanceTo(end); double halfLength = length / 2; using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); const string beamBlockName = "ScaffoldPole梁侧模"; if (!bt.Has(beamBlockName)) throw new InvalidOperationException($"找不到图块 '{beamBlockName}',请确认ScaffoldBlocks目录存在"); // 计算中点作为插入点 Point3d midPoint = new Point3d( (start.X + end.X) / 2, (start.Y + end.Y) / 2, start.Z ); BlockReference beamRef = new BlockReference(midPoint, bt[beamBlockName]); btr.AppendEntity(beamRef); tr.AddNewlyCreatedDBObject(beamRef, true); // 计算调整后的梁高 double adjustedBeamHeight = beamHeight - settings.SlabThickness; if (adjustedBeamHeight < 50) adjustedBeamHeight = 50; // 设置动态块参数 bool leftDistanceSet = false; bool rightDistanceSet = false; bool beamHeightSet = false; bool lBeamHeightSet = false; bool mBeamHeightSet = false; foreach (DynamicBlockReferenceProperty prop in beamRef.DynamicBlockReferencePropertyCollection) { string propName = prop.PropertyName.ToLower(); if (propName.Contains("左侧") || propName.Contains("左距离")) { prop.Value = settings.BeamWidth / 2; leftDistanceSet = true; } else if (propName.Contains("右侧") || propName.Contains("右距离")) { prop.Value = settings.BeamWidth / 2; rightDistanceSet = true; } else if (propName.Contains("梁高") && !propName.Contains("l梁高") && !propName.Contains("m梁高")) { prop.Value = adjustedBeamHeight; beamHeightSet = true; } else if (propName.Contains("l梁高")) { prop.Value = adjustedBeamHeight; lBeamHeightSet = true; } else if (propName.Contains("m梁高")) { prop.Value = adjustedBeamHeight; mBeamHeightSet = true; } } // 检查所有必要参数是否已设置 if (!leftDistanceSet || !rightDistanceSet || !beamHeightSet || !lBeamHeightSet || !mBeamHeightSet) { // 使用传入的ed对象输出警告 ed.WriteMessage("\n警告: 未找到所有动态属性,将使用替代方法设置块参数"); // 替代方法:直接设置图块比例 beamRef.TransformBy(Matrix3d.Scaling(settings.BeamWidth / 1000.0, midPoint)); } // 旋转图块 Vector3d direction = end - start; double angle = direction.GetAngleTo(Vector3d.XAxis); beamRef.TransformBy(Matrix3d.Rotation(angle, Vector3d.ZAxis, midPoint)); tr.Commit(); } } private void DrawSlabSupport(Database db, Point3d beamStart, Point3d beamEnd, double beamHeight) { if (!settings.DrawSlabSupport) return; Vector3d beamDirection = (beamEnd - beamStart).GetNormal(); double beamLength = beamStart.DistanceTo(beamEnd); // 计算板底位置 double slabZOffset = beamHeight + settings.SlabThickness + settings.SlabHeightOffset; Point3d slabStart = new Point3d(beamStart.X, beamStart.Y, beamStart.Z + slabZOffset); Point3d slabEnd = new Point3d(beamEnd.X, beamEnd.Y, beamEnd.Z + slabZOffset); using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); if (settings.SlabMainDirection == "横向") { // 根据材料选择图块 string blockName = settings.SlabSecondaryMaterial.Contains("方钢") ? "ScaffoldPole断面方钢" : "ScaffoldPole断面木方"; if (!bt.Has(blockName)) throw new InvalidOperationException($"找不到图块 '{blockName}',请确认ScaffoldBlocks目录存在"); // 计算阵列数量和间距 int arrayCount = Math.Max(2, (int)Math.Ceiling(beamLength / settings.SlabSecondarySpacing)); double spacing = beamLength / (arrayCount - 1); for (int i = 0; i < arrayCount; i++) { Point3d position = slabStart + (beamDirection * (i * spacing)); BlockReference supportRef = new BlockReference(position, bt[blockName]); btr.AppendEntity(supportRef); tr.AddNewlyCreatedDBObject(supportRef, true); // 设置材料尺寸 foreach (DynamicBlockReferenceProperty prop in supportRef.DynamicBlockReferencePropertyCollection) { string propName = prop.PropertyName.ToLower(); if (propName.Contains("宽度")) { prop.Value = settings.SlabSecondaryWidth; } else if (propName.Contains("高度")) { prop.Value = settings.SlabSecondaryHeight; } } // 根据方向决定是否旋转 double angle = 0; if (settings.SlabMainDirection == "横向") { // 横向方向 - 无需旋转 angle = 0; } else { // 纵向方向 - 旋转90度 angle = Math.PI / 2; } supportRef.TransformBy(Matrix3d.Rotation(angle, Vector3d.ZAxis, position)); } } else { // 纵向龙骨:单根横向龙骨 const string slabBlockName = "ScaffoldPole横向龙骨"; if (!bt.Has(slabBlockName)) throw new InvalidOperationException($"找不到图块 '{slabBlockName}',请确认ScaffoldBlocks目录存在"); Point3d center = new Point3d( (slabStart.X + slabEnd.X) / 2, (slabStart.Y + slabEnd.Y) / 2, slabStart.Z ); BlockReference supportRef = new BlockReference(center, bt[slabBlockName]); btr.AppendEntity(supportRef); tr.AddNewlyCreatedDBObject(supportRef, true); // 设置长度属性和尺寸 foreach (DynamicBlockReferenceProperty prop in supportRef.DynamicBlockReferencePropertyCollection) { string propName = prop.PropertyName.ToLower(); if (propName.Contains("长度")) { prop.Value = beamLength; } else if (propName.Contains("次龙骨宽")) { prop.Value = settings.SlabSecondaryWidth; } else if (propName.Contains("次龙骨高")) { prop.Value = settings.SlabSecondaryHeight; } } // 旋转方向 Vector3d dir = beamEnd - beamStart; double angle = dir.GetAngleTo(Vector3d.XAxis); supportRef.TransformBy(Matrix3d.Rotation(angle, Vector3d.ZAxis, center)); } tr.Commit(); } } } public class BeamSettings { // 梁参数 public bool DrawBeamFormwork { get; set; } = true; public bool DrawBeamSupport { get; set; } = true; public string BeamMainDirection { get; set; } = "横向"; public double BeamExtension { get; set; } = 50; public double BeamWidth { get; set; } = 300; // 梁宽参数 public double BeamHeight { get; set; } = 700; // 梁高参数 public string BeamMainMaterial { get; set; } = "100方钢"; public string BeamSecondaryMaterial { get; set; } = "50木方"; public double BeamSecondarySpacing { get; set; } = 100; public double BeamSecondaryHeight { get; set; } = 90; public double BeamSecondaryWidth { get; set; } = 40; // 板参数 public double SlabThickness { get; set; } = 250; public bool DrawSlabSupport { get; set; } = true; public string SlabMainDirection { get; set; } = "横向"; public bool KeepSupport { get; set; } = true; public string SlabMainMaterial { get; set; } = "100方钢"; public string SlabSecondaryMaterial { get; set; } = "3木方"; public double SlabSecondarySpacing { get; set; } = 250; public double SlabSecondaryHeight { get; set; } = 90; public double SlabSecondaryWidth { get; set; } = 40; public double SlabHeightOffset { get; set; } = 0; } public class SettingsForm : Form { private BeamSettings settings; private Dictionary<string, Control> controls = new Dictionary<string, Control>(); public SettingsForm(BeamSettings settings) { this.settings = settings; InitializeForm(); this.FormClosing += SettingsForm_FormClosing; } private void SettingsForm_FormClosing(object sender, FormClosingEventArgs e) { if (this.DialogResult == DialogResult.OK) { SaveFormData(); } } private void SaveFormData() { // 梁侧模设置 settings.DrawBeamFormwork = ((RadioButton)controls["rbBeamFormworkYes"]).Checked; settings.DrawBeamSupport = ((RadioButton)controls["rbBeamSupportYes"]).Checked; settings.BeamMainDirection = ((RadioButton)controls["rbBeamHorizontal"]).Checked ? "横向" : "纵向"; settings.BeamExtension = double.Parse(((TextBox)controls["tbBeamExtension"]).Text); settings.BeamMainMaterial = ((ComboBox)controls["cbBeamMainMaterial"]).Text; settings.BeamSecondaryMaterial = ((ComboBox)controls["cbBeamSecondaryMaterial"]).Text; settings.BeamSecondarySpacing = double.Parse(((TextBox)controls["tbBeamSecondarySpacing"]).Text); settings.BeamSecondaryHeight = double.Parse(((TextBox)controls["tbBeamSecondaryHeight"]).Text); settings.BeamSecondaryWidth = double.Parse(((TextBox)controls["tbBeamSecondaryWidth"]).Text); // 板设置 settings.SlabThickness = double.Parse(((TextBox)controls["tbSlabThickness"]).Text); settings.DrawSlabSupport = ((RadioButton)controls["rbSlabSupportYes"]).Checked; settings.SlabMainDirection = ((RadioButton)controls["rbSlabHorizontal"]).Checked ? "横向" : "纵向"; settings.SlabMainMaterial = ((ComboBox)controls["cbSlabMainMaterial"]).Text; settings.SlabSecondaryMaterial = ((ComboBox)controls["cbSlabSecondaryMaterial"]).Text; settings.SlabSecondarySpacing = double.Parse(((TextBox)controls["tbSlabSpacing"]).Text); settings.SlabSecondaryHeight = double.Parse(((TextBox)controls["tbSlabSecondaryHeight"]).Text); settings.SlabSecondaryWidth = double.Parse(((TextBox)controls["tbSlabSecondaryWidth"]).Text); } private void InitializeForm() { this.Text = "梁板剖面绘制参数设置"; this.Size = new System.Drawing.Size(450, 650); // 高度减少 this.FormBorderStyle = FormBorderStyle.FixedDialog; this.StartPosition = FormStartPosition.CenterScreen; TabControl tabControl = new TabControl(); tabControl.Dock = DockStyle.Fill; // 梁下龙骨选项卡 TabPage beamTab = new TabPage("梁下龙骨"); InitializeBeamTab(beamTab); // 板下龙骨选项卡 TabPage slabTab = new TabPage("板下龙骨"); InitializeSlabTab(slabTab); tabControl.TabPages.Add(beamTab); tabControl.TabPages.Add(slabTab); // 按钮面板 Panel buttonPanel = new Panel(); buttonPanel.Dock = DockStyle.Bottom; buttonPanel.Height = 50; Button okButton = new Button(); okButton.Text = "开始绘制"; okButton.DialogResult = DialogResult.OK; okButton.Location = new System.Drawing.Point(120, 10); okButton.Size = new System.Drawing.Size(90, 30); Button cancelButton = new Button(); cancelButton.Text = "取消"; cancelButton.DialogResult = DialogResult.Cancel; cancelButton.Location = new System.Drawing.Point(240, 10); cancelButton.Size = new System.Drawing.Size(90, 30); buttonPanel.Controls.Add(okButton); buttonPanel.Controls.Add(cancelButton); this.Controls.Add(tabControl); this.Controls.Add(buttonPanel); } private void InitializeBeamTab(TabPage tab) { tab.Controls.Clear(); tab.AutoScroll = true; int yPos = 20; // 绘制梁侧模 GroupBox gbBeamFormwork = new GroupBox(); gbBeamFormwork.Text = "绘制梁侧模"; gbBeamFormwork.Location = new System.Drawing.Point(20, yPos); gbBeamFormwork.Size = new System.Drawing.Size(380, 50); RadioButton rbBeamFormworkYes = new RadioButton(); rbBeamFormworkYes.Text = "是"; rbBeamFormworkYes.Checked = settings.DrawBeamFormwork; rbBeamFormworkYes.Location = new System.Drawing.Point(30, 20); controls.Add("rbBeamFormworkYes", rbBeamFormworkYes); RadioButton rbBeamFormworkNo = new RadioButton(); rbBeamFormworkNo.Text = "否"; rbBeamFormworkNo.Checked = !settings.DrawBeamFormwork; rbBeamFormworkNo.Location = new System.Drawing.Point(200, 20); controls.Add("rbBeamFormworkNo", rbBeamFormworkNo); gbBeamFormwork.Controls.Add(rbBeamFormworkYes); gbBeamFormwork.Controls.Add(rbBeamFormworkNo); tab.Controls.Add(gbBeamFormwork); yPos += 60; // 绘制梁龙骨 GroupBox gbBeamSupport = new GroupBox(); gbBeamSupport.Text = "绘制梁龙骨"; gbBeamSupport.Location = new System.Drawing.Point(20, yPos); gbBeamSupport.Size = new System.Drawing.Size(380, 50); RadioButton rbBeamSupportYes = new RadioButton(); rbBeamSupportYes.Text = "是"; rbBeamSupportYes.Checked = settings.DrawBeamSupport; rbBeamSupportYes.Location = new System.Drawing.Point(30, 20); controls.Add("rbBeamSupportYes", rbBeamSupportYes); RadioButton rbBeamSupportNo = new RadioButton(); rbBeamSupportNo.Text = "否"; rbBeamSupportNo.Checked = !settings.DrawBeamSupport; rbBeamSupportNo.Location = new System.Drawing.Point(200, 20); controls.Add("rbBeamSupportNo", rbBeamSupportNo); gbBeamSupport.Controls.Add(rbBeamSupportYes); gbBeamSupport.Controls.Add(rbBeamSupportNo); tab.Controls.Add(gbBeamSupport); yPos += 60; // 主龙骨方向 GroupBox gbBeamDirection = new GroupBox(); gbBeamDirection.Text = "主龙骨方向"; gbBeamDirection.Location = new System.Drawing.Point(20, yPos); gbBeamDirection.Size = new System.Drawing.Size(380, 100); RadioButton rbBeamHorizontal = new RadioButton(); rbBeamHorizontal.Text = "横向"; rbBeamHorizontal.Checked = (settings.BeamMainDirection == "横向"); rbBeamHorizontal.Location = new System.Drawing.Point(30, 20); controls.Add("rbBeamHorizontal", rbBeamHorizontal); RadioButton rbBeamVertical = new RadioButton(); rbBeamVertical.Text = "纵向"; rbBeamVertical.Checked = (settings.BeamMainDirection == "纵向"); rbBeamVertical.Location = new System.Drawing.Point(200, 20); controls.Add("rbBeamVertical", rbBeamVertical); Label lblBeamExtension = new Label(); lblBeamExtension.Text = "横龙骨延伸宽度(mm):"; lblBeamExtension.Location = new System.Drawing.Point(30, 60); lblBeamExtension.AutoSize = true; TextBox tbBeamExtension = new TextBox(); tbBeamExtension.Text = settings.BeamExtension.ToString(); tbBeamExtension.Location = new System.Drawing.Point(200, 55); tbBeamExtension.Width = 100; controls.Add("tbBeamExtension", tbBeamExtension); gbBeamDirection.Controls.Add(rbBeamHorizontal); gbBeamDirection.Controls.Add(rbBeamVertical); gbBeamDirection.Controls.Add(lblBeamExtension); gbBeamDirection.Controls.Add(tbBeamExtension); tab.Controls.Add(gbBeamDirection); yPos += 110; // 材料设置 GroupBox gbBeamMaterial = new GroupBox(); gbBeamMaterial.Text = "材料设置"; gbBeamMaterial.Location = new System.Drawing.Point(20, yPos); gbBeamMaterial.Size = new System.Drawing.Size(380, 250); // 高度减少 Label lblBeamMainMaterial = new Label(); lblBeamMainMaterial.Text = "主龙骨:"; lblBeamMainMaterial.Location = new System.Drawing.Point(30, 30); lblBeamMainMaterial.AutoSize = true; ComboBox cbBeamMainMaterial = new ComboBox(); cbBeamMainMaterial.Items.AddRange(new object[] { "3木方", "5大方", "50钢包木", "48钢管", "40方钢", "50方钢", "100方钢", "8#槽钢", "10#槽钢" }); cbBeamMainMaterial.Text = settings.BeamMainMaterial; cbBeamMainMaterial.Location = new System.Drawing.Point(220, 25); cbBeamMainMaterial.Width = 130; controls.Add("cbBeamMainMaterial", cbBeamMainMaterial); Label lblBeamSecondaryMaterial = new Label(); lblBeamSecondaryMaterial.Text = "次龙骨:"; lblBeamSecondaryMaterial.Location = new System.Drawing.Point(30, 70); lblBeamSecondaryMaterial.AutoSize = true; ComboBox cbBeamSecondaryMaterial = new ComboBox(); cbBeamSecondaryMaterial.Items.AddRange(new object[] { "3木方", "5大方", "50钢包木", "48钢管", "40方钢", "50方钢", "100方钢", "8#槽钢", "10#槽钢" }); cbBeamSecondaryMaterial.Text = settings.BeamSecondaryMaterial; cbBeamSecondaryMaterial.Location = new System.Drawing.Point(220, 65); cbBeamSecondaryMaterial.Width = 130; controls.Add("cbBeamSecondaryMaterial", cbBeamSecondaryMaterial); Label lblBeamSecondarySpacing = new Label(); lblBeamSecondarySpacing.Text = "次龙骨间距(mm):"; lblBeamSecondarySpacing.Location = new System.Drawing.Point(30, 110); lblBeamSecondarySpacing.AutoSize = true; TextBox tbBeamSecondarySpacing = new TextBox(); tbBeamSecondarySpacing.Text = settings.BeamSecondarySpacing.ToString(); tbBeamSecondarySpacing.Location = new System.Drawing.Point(220, 105); tbBeamSecondarySpacing.Width = 130; controls.Add("tbBeamSecondarySpacing", tbBeamSecondarySpacing); Label lblBeamSecondaryWidth = new Label(); lblBeamSecondaryWidth.Text = "次龙骨宽(mm):"; lblBeamSecondaryWidth.Location = new System.Drawing.Point(30, 150); lblBeamSecondaryWidth.AutoSize = true; TextBox tbBeamSecondaryWidth = new TextBox(); tbBeamSecondaryWidth.Text = settings.BeamSecondaryWidth.ToString(); tbBeamSecondaryWidth.Location = new System.Drawing.Point(220, 145); tbBeamSecondaryWidth.Width = 130; controls.Add("tbBeamSecondaryWidth", tbBeamSecondaryWidth); Label lblBeamSecondaryHeight = new Label(); lblBeamSecondaryHeight.Text = "次龙骨高(mm):"; lblBeamSecondaryHeight.Location = new System.Drawing.Point(30, 190); lblBeamSecondaryHeight.AutoSize = true; TextBox tbBeamSecondaryHeight = new TextBox(); tbBeamSecondaryHeight.Text = settings.BeamSecondaryHeight.ToString(); tbBeamSecondaryHeight.Location = new System.Drawing.Point(220, 185); tbBeamSecondaryHeight.Width = 130; controls.Add("tbBeamSecondaryHeight", tbBeamSecondaryHeight); gbBeamMaterial.Controls.Add(lblBeamMainMaterial); gbBeamMaterial.Controls.Add(cbBeamMainMaterial); gbBeamMaterial.Controls.Add(lblBeamSecondaryMaterial); gbBeamMaterial.Controls.Add(cbBeamSecondaryMaterial); gbBeamMaterial.Controls.Add(lblBeamSecondarySpacing); gbBeamMaterial.Controls.Add(tbBeamSecondarySpacing); gbBeamMaterial.Controls.Add(lblBeamSecondaryWidth); gbBeamMaterial.Controls.Add(tbBeamSecondaryWidth); gbBeamMaterial.Controls.Add(lblBeamSecondaryHeight); gbBeamMaterial.Controls.Add(tbBeamSecondaryHeight); tab.Controls.Add(gbBeamMaterial); } private void InitializeSlabTab(TabPage tab) { tab.Controls.Clear(); tab.AutoScroll = true; int yPos = 20; // 默认板厚 GroupBox gbSlabThickness = new GroupBox(); gbSlabThickness.Text = "板厚设置"; gbSlabThickness.Location = new System.Drawing.Point(20, yPos); gbSlabThickness.Size = new System.Drawing.Size(380, 60); TextBox tbSlabThickness = new TextBox(); tbSlabThickness.Text = settings.SlabThickness.ToString(); tbSlabThickness.Location = new System.Drawing.Point(220, 20); tbSlabThickness.Width = 130; controls.Add("tbSlabThickness", tbSlabThickness); gbSlabThickness.Controls.Add(new Label() { Text = "默认板厚(mm):", Location = new System.Drawing.Point(30, 25), AutoSize = true }); gbSlabThickness.Controls.Add(tbSlabThickness); tab.Controls.Add(gbSlabThickness); yPos += 70; // 绘制板龙骨 GroupBox gbDrawSlabSupport = new GroupBox(); gbDrawSlabSupport.Text = "绘制板龙骨"; gbDrawSlabSupport.Location = new System.Drawing.Point(20, yPos); gbDrawSlabSupport.Size = new System.Drawing.Size(380, 60); RadioButton rbSlabSupportYes = new RadioButton(); rbSlabSupportYes.Text = "是"; rbSlabSupportYes.Checked = settings.DrawSlabSupport; rbSlabSupportYes.Location = new System.Drawing.Point(30, 25); controls.Add("rbSlabSupportYes", rbSlabSupportYes); RadioButton rbSlabSupportNo = new RadioButton(); rbSlabSupportNo.Text = "否"; rbSlabSupportNo.Checked = !settings.DrawSlabSupport; rbSlabSupportNo.Location = new System.Drawing.Point(200, 25); controls.Add("rbSlabSupportNo", rbSlabSupportNo); gbDrawSlabSupport.Controls.Add(rbSlabSupportYes); gbDrawSlabSupport.Controls.Add(rbSlabSupportNo); tab.Controls.Add(gbDrawSlabSupport); yPos += 70; // 主龙骨方向 GroupBox gbSlabDirection = new GroupBox(); gbSlabDirection.Text = "主龙骨方向"; gbSlabDirection.Location = new System.Drawing.Point(20, yPos); gbSlabDirection.Size = new System.Drawing.Size(380, 60); RadioButton rbSlabHorizontal = new RadioButton(); rbSlabHorizontal.Text = "横向"; rbSlabHorizontal.Checked = (settings.SlabMainDirection == "横向"); rbSlabHorizontal.Location = new System.Drawing.Point(30, 25); controls.Add("rbSlabHorizontal", rbSlabHorizontal); RadioButton rbSlabVertical = new RadioButton(); rbSlabVertical.Text = "纵向"; rbSlabVertical.Checked = (settings.SlabMainDirection == "纵向"); rbSlabVertical.Location = new System.Drawing.Point(200, 25); controls.Add("rbSlabVertical", rbSlabVertical); gbSlabDirection.Controls.Add(rbSlabHorizontal); gbSlabDirection.Controls.Add(rbSlabVertical); tab.Controls.Add(gbSlabDirection); yPos += 70; // 次龙骨设置 GroupBox gbSlabSecondary = new GroupBox(); gbSlabSecondary.Text = "龙骨设置"; gbSlabSecondary.Location = new System.Drawing.Point(20, yPos); gbSlabSecondary.Size = new System.Drawing.Size(380, 210); Label lblSlabMainMaterial = new Label(); lblSlabMainMaterial.Text = "主龙骨材料:"; lblSlabMainMaterial.Location = new System.Drawing.Point(30, 30); lblSlabMainMaterial.AutoSize = true; ComboBox cbSlabMainMaterial = new ComboBox(); cbSlabMainMaterial.Items.AddRange(new object[] { "3木方", "5大方", "极钢包木", "48钢管", "40方钢", "50方钢", "100方钢", "8#槽钢", "极#槽钢" }); cbSlabMainMaterial.Text = settings.SlabMainMaterial; cbSlabMainMaterial.Location = new System.Drawing.Point(220, 25); cbSlabMainMaterial.Width = 130; controls.Add("cbSlabMainMaterial", cbSlabMainMaterial); Label lblSlabSecondaryMaterial = new Label(); lblSlabSecondaryMaterial.Text = "次龙骨材料:"; lblSlabSecondaryMaterial.Location = new System.Drawing.Point(30, 70); lblSlabSecondaryMaterial.AutoSize = true; ComboBox cbSlabSecondaryMaterial = new ComboBox(); cbSlabSecondaryMaterial.Items.AddRange(new object[] { "3木方", "5大方", "50钢包木", "48钢管", "40方钢", "50方钢", "100方钢", "8#槽钢", "极#槽钢" }); cbSlabSecondaryMaterial.Text = settings.SlabSecondaryMaterial; cbSlabSecondaryMaterial.Location = new System.Drawing.Point(220, 65); cbSlabSecondaryMaterial.Width = 130; controls.Add("cbSlabSecondaryMaterial", cbSlabSecondaryMaterial); Label lblSlabSpacing = new Label(); lblSlabSpacing.Text = "次龙骨间距(mm):"; lblSlabSpacing.Location = new System.Drawing.Point(30, 110); lblSlabSpacing.AutoSize = true; TextBox tbSlabSpacing = new TextBox(); tbSlabSpacing.Text = settings.SlabSecondarySpacing.ToString(); tbSlabSpacing.Location = new System.Drawing.Point(220, 105); tbSlabSpacing.Width = 130; controls.Add("tbSlabSpacing", tbSlabSpacing); Label lblSlabSecondaryWidth = new Label(); lblSlabSecondaryWidth.Text = "次龙骨宽(mm):"; lblSlabSecondaryWidth.Location = new System.Drawing.Point(30, 150); lblSlabSecondaryWidth.AutoSize = true; TextBox tbSlabSecondaryWidth = new TextBox(); tbSlabSecondaryWidth.Text = settings.SlabSecondaryWidth.ToString(); tbSlabSecondaryWidth.Location = new System.Drawing.Point(220, 145); tbSlabSecondaryWidth.Width = 130; controls.Add("tbSlabSecondaryWidth", tbSlabSecondaryWidth); Label lblSlabSecondaryHeight = new Label(); lblSlabSecondaryHeight.Text = "次龙骨高(mm):"; lblSlabSecondaryHeight.Location = new System.Drawing.Point(30, 190); lblSlabSecondaryHeight.AutoSize = true; TextBox tbSlabSecondaryHeight = new TextBox(); tbSlabSecondaryHeight.Text = settings.SlabSecondaryHeight.ToString(); tbSlabSecondaryHeight.Location = new System.Drawing.Point(220, 185); tbSlabSecondaryHeight.Width = 130; controls.Add("tbSlabSecondaryHeight", tbSlabSecondaryHeight); gbSlabSecondary.Controls.Add(lblSlabMainMaterial); gbSlabSecondary.Controls.Add(cbSlabMainMaterial); gbSlabSecondary.Controls.Add(lblSlabSecondaryMaterial); gbSlabSecondary.Controls.Add(cbSlabSecondaryMaterial); gbSlabSecondary.Controls.Add(lblSlabSpacing); gbSlabSecondary.Controls.Add(tbSlabSpacing); gbSlabSecondary.Controls.Add(lblSlabSecondaryWidth); gbSlabSecondary.Controls.Add(tbSlabSecondaryWidth); gbSlabSecondary.Controls.Add(lblSlabSecondaryHeight); gbSlabSecondary.Controls.Add(tbSlabSecondaryHeight); tab.Controls.Add(gbSlabSecondary); } } } 点击“开始绘制”按钮后弹窗显示错误,无法绘制 应用程序不支持实时(JIT)调试。 有关详细信息,请参见此消息的结尾。 ************** 异常文本 ************** System.FormatException: 输入字符串的格式不正确。 在 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) 在 System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) 在 System.String.System.IConvertible.ToInt32(IFormatProvider provider) 在 BeamSectionPlugin.BeamSectionDrawer.DrawBeamSection() 位置 C:\Users\卓越生活\Desktop\梁板剖面绘制2\梁板剖面绘制\Class1.cs:行号 44 在 Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction) 在 Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction) 在 Autodesk.AutoCAD.Runtime.PerDocumentCommandClass.Invoke(MethodInfo mi, Boolean bLispFunction) 在 Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()
08-12
PS C:\Users\Administrator> # 加载必要程序集 PS C:\Users\Administrator> Add-Type -AssemblyName System.Net.Http -ErrorAction Stop PS C:\Users\Administrator> PS C:\Users\Administrator> function Invoke-EnhancedCurlRequest { >> [CmdletBinding()] >> param( >> [Parameter(Mandatory=$true)] >> [string]$Uri, >> [ValidateSet('GET','POST','PUT','DELETE','PATCH','HEAD','OPTIONS')] >> [string]$Method = 'GET', >> [hashtable]$Headers = @{}, >> [object]$Body, >> [int]$Timeout = 30, >> [switch]$SkipCertificateCheck, >> [switch]$UseGzipCompression >> ) >> >> $resultTemplate = [PSCustomObject]@{ >> StatusCode = 0 >> StatusMessage = "NotExecuted" >> Headers = [ordered]@{} >> Content = $null >> IsSuccess = $false >> Technology = "None" >> ErrorMessage = $null >> ElapsedMs = 0 >> } >> >> $timer = [System.Diagnostics.Stopwatch]::StartNew() >> $result = $resultTemplate.PSObject.Copy() >> $result.Technology = "HttpClient" >> >> $handler = $null >> $client = $null >> $request = $null >> $response = $null >> >> try { >> # 创建 HttpClientHandler >> $handler = New-Object System.Net.Http.HttpClientHandler >> >> # 修复证书验证 - 使用静态方法解决运行空间问题 >> if ($SkipCertificateCheck) { >> # 定义静态C#方法用于证书验证 >> $certCallbackSource = @" >> using System.Net.Security; >> using System.Security.Cryptography.X509Certificates; >> >> public static class CertificateValidator { >> public static bool AlwaysAccept( >> object sender, >> X509Certificate certificate, >> X509Chain chain, >> SslPolicyErrors sslPolicyErrors) >> { >> return true; >> } >> } >> "@ >> try { >> Add-Type -TypeDefinition $certCallbackSource -ErrorAction Stop >> } catch { >> # 忽略类型已存在的错误 >> if (-not $_.Exception.Message.Contains("already exists")) { >> throw >> } >> } >> >> # 设置证书验证回调 >> $handler.ServerCertificateCustomValidationCallback = [CertificateValidator]::AlwaysAccept >> } >> >> if ($UseGzipCompression) { >> $handler.AutomaticDecompression = [System.Net.DecompressionMethods]::GZip >> } >> >> # 创建 HttpClient >> $client = New-Object System.Net.Http.HttpClient($handler) >> >> # 设置超时时间 >> if ($Timeout -gt 0) { >> $client.Timeout = [System.TimeSpan]::FromSeconds($Timeout) >> } else { >> $client.Timeout = [System.TimeSpan]::FromSeconds(30) >> } >> >> # 创建请求方法对象 >> try { >> $httpMethod = [System.Net.Http.HttpMethod]::new($Method) >> } catch { >> $httpMethod = New-Object System.Net.Http.HttpMethod -ArgumentList $Method >> } >> >> # 创建请求消息 >> $request = New-Object System.Net.Http.HttpRequestMessage($httpMethod, $Uri) >> >> # 添加默认 User-Agent >> if (-not $Headers.ContainsKey('User-Agent')) { >> $request.Headers.TryAddWithoutValidation("User-Agent", "PowerShell-HTTPClient/1.0") >> } >> >> # 添加自定义头 >> foreach ($key in $Headers.Keys) { >> if (-not $request.Headers.TryAddWithoutValidation($key, $Headers[$key])) { >> if (-not $request.Content) { >> $request.Content = New-Object System.Net.Http.StringContent("") >> } >> $request.Content.Headers.TryAddWithoutValidation($key, $Headers[$key]) >> } >> } >> >> # 处理请求体 >> if ($Body -and @('POST','PUT','PATCH') -contains $Method) { >> if ($Body -is [byte[]]) { >> $request.Content = New-Object System.Net.Http.ByteArrayContent($Body) >> } elseif ($Body -is [hashtable] -or $Body -is [System.Collections.IDictionary]) { >> $jsonBody = $Body | ConvertTo-Json -Depth 5 -Compress >> $request.Content = New-Object System.Net.Http.StringContent( >> $jsonBody, >> [System.Text.Encoding]::UTF8, >> "application/json" >> ) >> } elseif ($Body -is [string]) { >> $request.Content = New-Object System.Net.Http.StringContent( >> $Body, >> [System.Text.Encoding]::UTF8 >> ) >> } else { >> throw "Unsupported body type: $($Body.GetType().Name)" >> } >> } >> >> # 发送请求 >> $response = $client.SendAsync($request).GetAwaiter().GetResult() >> >> # 解析响应 >> $result.StatusCode = [int]$response.StatusCode >> $result.StatusMessage = $response.ReasonPhrase >> $result.IsSuccess = $response.IsSuccessStatusCode >> >> $result.Headers = [ordered]@{} >> foreach ($header in $response.Headers) { >> $result.Headers[$header.Key] = $header.Value -join ", " >> } >> >> foreach ($header in $response.Content.Headers) { >> $result.Headers[$header.Key] = $header.Value -join ", " >> } >> >> $result.Content = $response.Content.ReadAsStringAsync().GetAwaiter().GetResult() >> return $result >> } catch [System.Threading.Tasks.TaskCanceledException] { >> $result.ErrorMessage = "Request timed out after $Timeout seconds" >> $result.StatusCode = 408 >> $result.StatusMessage = "Timeout" >> return $result >> } catch [System.Net.Http.HttpRequestException] { >> # 处理特定HTTP请求异常 >> $ex = $_.Exception >> $result.ErrorMessage = $ex.ToString() >> >> # 检查内部异常是否为SocketException(DNS解析错误) >> $currentException = $ex >> $dnsError = $false >> while ($currentException -ne $null) { >> if ($currentException -is [System.Net.Sockets.SocketException]) { >> $dnsError = $true >> break >> } >> $currentException = $currentException.InnerException >> } >> >> if ($dnsError) { >> $result.StatusCode = 0 >> $result.StatusMessage = "DNSResolutionFailed" >> } else { >> $result.StatusCode = 500 >> $result.StatusMessage = "HttpRequestError" >> } >> >> return $result >> } catch { >> # 通用错误处理 >> $result.ErrorMessage = $_.Exception.ToString() >> $result.StatusCode = 500 >> $result.StatusMessage = "InternalError" >> return $result >> } finally { >> $timer.Stop() >> $result.ElapsedMs = $timer.ElapsedMilliseconds >> >> # 安全清理资源 >> if ($response -is [IDisposable]) { $response.Dispose() } >> if ($request -is [IDisposable]) { $request.Dispose() } >> if ($client -is [IDisposable]) { $client.Dispose() } >> if ($handler -is [IDisposable]) { $handler.Dispose() } >> } >> } >> PS C:\Users\Administrator> # 测试自签名证书网站 PS C:\Users\Administrator> $result = Invoke-EnhancedCurlRequest -Uri "https://self-signed.badssl.com/" -SkipCertificateCheck PS C:\Users\Administrator> PS C:\Users\Administrator> if ($result.IsSuccess) { >> Write-Host "✅ 自签名证书网站访问成功" -ForegroundColor Green >> $result.Headers >> } else { >> Write-Host "❌ 自签名证书网站访问失败: $($result.ErrorMessage)" -ForegroundColor Red >> } >> ❌ 自签名证书网站访问失败: System.Management.Automation.SetValueInvocationException: 设置“ServerCertificateCustomValidationCallback”时发生异常:“无法将“System.Management.Automation.PSMethod”类型的“static bool AlwaysAccept(System.Object sender, X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)”值转换为“System.Func`5[System.Net.Http.HttpRequestMessage,System.Security.Cryptography.X509Certificates.X509Certificate2,System.Security.Cryptography.X509Certificates.X509Chain,System.Net.Security.SslPolicyErrors,System.Boolean]”类型。” ---> System.Management.Automation.PSInvalidCastException: 无法将“System.Management.Automation.PSMethod”类型的“static bool AlwaysAccept(System.Object sender, X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)”值转换为“System.Func`5[System.Net.Http.HttpRequestMessage,System.Security.Cryptography.X509Certificates.X509Certificate2,System.Security.Cryptography.X509Certificates.X509Chain,System.Net.Security.SslPolicyErrors,System.Boolean]”类型。 在 System.Management.Automation.LanguagePrimitives.ThrowInvalidCastException(Object valueToConvert, Type resultType) 在 System.Management.Automation.LanguagePrimitives.ConvertNoConversion(Object valueToConvert, Type resultType, Boolean recurse, PSObject originalValueToConvert, IFormatProvider formatProvider, TypeTable backupTable) 在 CallSite.Target(Closure , CallSite , Object , Object ) --- 内部异常堆栈跟踪的结尾 --- 在 System.Management.Automation.ExceptionHandlingOps.CheckActionPreference(FunctionContext funcContext, Exception exception) 在 System.Management.Automation.Interpreter.ActionCallInstruction`2.Run(InterpretedFrame frame) 在 System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame) 在 System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame) PS C:\Users\Administrator> # 测试无效域名 PS C:\Users\Administrator> $result = Invoke-EnhancedCurlRequest -Uri "https://invalid.domain.abc/" PS C:\Users\Administrator> PS C:\Users\Administrator> if ($result.StatusCode -eq 0) { >> Write-Host "✅ DNS错误处理成功" -ForegroundColor Green >> } else { >> Write-Host "❌ DNS错误处理失败: $($result.StatusCode)" -ForegroundColor Red >> } >> ❌ DNS错误处理失败: 500 PS C:\Users\Administrator> # 测试正常网站 PS C:\Users\Administrator> $result = Invoke-EnhancedCurlRequest -Uri "https://httpbin.org/get" PS C:\Users\Administrator> PS C:\Users\Administrator> if ($result.IsSuccess) { >> Write-Host "✅ 正常网站访问成功" -ForegroundColor Green >> $result.Content | ConvertFrom-Json >> } else { >> Write-Host "❌ 正常网站访问失败: $($result.ErrorMessage)" -ForegroundColor Red >> } >> ✅ 正常网站访问成功 args headers ---- ------- @{Host=httpbin.org; User-Agent=PowerShell-HTTPClient/1.0; X-Amzn-Trace-Id=Root=1-68a04993-6af65163450fd2bf5af48... PS C:\Users\Administrator> # 测试POST请求 PS C:\Users\Administrator> $postData = @{ >> name = "John Doe" >> email = "john@example.com" >> } >> $result = Invoke-EnhancedCurlRequest -Uri "https://httpbin.org/post" -Method POST -Body $postData >> PS C:\Users\Administrator> if ($result.IsSuccess) { >> Write-Host "✅ POST请求成功" -ForegroundColor Green >> ($result.Content | ConvertFrom-Json).json >> } else { >> Write-Host "❌ POST请求失败: $($result.StatusCode)" -ForegroundColor Red >> } >>
最新发布
08-17
<think>好的,我现在需要分析用户提供的这段代码,并解释它的功能和执行逻辑。用户给出的代码是: sContent = PC.gReverseStringByByte(Convert.ToString(iAVoltage, 16).PadLeft(8, '0')) + PC.gReverseStringByByte(Convert.ToString(iBVoltage, 16).PadLeft(8, '0')) + PC.gReverseStringByByte(Convert.ToString(iCVoltage, 16).PadLeft(8, '0')) + PC.gReverseStringByByte(Convert.ToString(iACurrent, 16).PadLeft(8, '0')) + PC.gReverseStringByByte(Convert.ToString(iBCurrent, 16).PadLeft(8, '0')) + PC.gReverseStringByByte(Convert.ToString(iCCurrent, 16).PadLeft(8, '0')) + "00000000"; 首先,我需要理解每一部分的含义。看起来这是在将多个变量转换成十六进制字符串,进行填充和对字节顺序进行调整,然后拼接成一个字符串sContent。最后还加上了"00000000"。可能需要处理的是某种协议格式,比如通信协议中的数据包构造,特别是涉及到字节顺序(大端或小端)的问题。 接下来,我需要拆解每一个步骤: 1. **Convert.ToString(iAVoltage, 16)**:将变量iAVoltage转换为十六进制的字符串。这里的参数16表示转换为十六进制。 2. **PadLeft(8, '0')**:将转换后的字符串填充到8个字符,不足的部分在左边补零。例如,如果转换后的字符串是"1A3",填充后会变成"00001A3",确保每个部分都是8个字符长,这可能对应于4字节的数据(每个十六进制字符代表4位,8个字符就是32位,即4字节)。 3. **PC.gReverseStringByByte()**:这个方法可能是将字符串按字节反转。例如,如果输入是"12345678",按字节反转(假设每两个字符为一个字节)可能变成"78563412",即小端模式转换为大端模式或反之。需要确认这个方法的具体实现,但根据名称推测是按字节反转。 4. 对iBVoltage、iCVoltage、iACurrent、iBCurrent、iCCurrent进行相同的处理,然后将所有处理后的字符串拼接起来,最后加上"00000000"。 可能的用途是构造一个包含电压和电流数据的报文,每个数据项占4字节,按特定字节顺序排列,最后可能有保留字段或校验部分用"00000000"填充。 需要注意的是,这里所有的电压和电流变量都是整数类型,转换为十六进制后填充到8字符,确保每个数据项占4字节。然后通过反转字节顺序来调整端序,可能为了符合接收方的字节序要求。最后的"00000000"可能是预留的字段,比如校验位或其他信息,当前暂时填充为0。 可能的疑问点包括: - PC类的gReverseStringByByte方法的具体实现,如何分割和反转字节。 - 为什么每个值要填充到8个字符,即4字节,是否与协议规定的字段长度有关。 - 最后的"00000000"的作用是什么,是否是必须的填充或特定字段。 需要进一步确认这些方法的作用和协议规范,但根据现有信息,可以推断出代码的主要目的是将多个数值转换为特定格式的十六进制字符串,并调整字节顺序后拼接成最终的数据包内容。</think>我们逐步解析以下代码的执行逻辑和功能: ```csharp sContent = PC.gReverseStringByByte(Convert.ToString(iAVoltage, 16).PadLeft(8, '0')) + PC.gReverseStringByByte(Convert.ToString(iBVoltage, 16).PadLeft(8, '0')) + PC.gReverseStringByByte(Convert.ToString(iCVoltage, 16).PadLeft(8, '0')) + PC.gReverseStringByByte(Convert.ToString(iACurrent, 16).PadLeft(8, '0')) + PC.gReverseStringByByte(Convert.ToString(iBCurrent, 16).PadLeft(8, '0')) + PC.gReverseStringByByte(Convert.ToString(iCCurrent, 16).PadLeft(8, '0')) + "00000000"; ``` --- ### **1. 代码目标** 这段代码的目的是 **构造一个包含电压、电流数据的通信报文**,格式为十六进制字符串,并遵循特定字节序规则。 --- ### **2. 分步解析** #### **(1) 数值转十六进制字符串** ```csharp Convert.ToString(iAVoltage, 16) // 将整数 iAVoltage 转为十六进制字符串 ``` - **功能**:将变量 `iAVoltage`(A相电压)转换为十六进制字符串。 - **示例**:若 `iAVoltage = 1000`,结果为 `"3e8"`。 #### **(2) 填充对齐** ```csharp .PadLeft(8, '0') // 左补零至8位长度 ``` - **功能**:确保字符串长度为8字符,对应4字节(每个十六进制字符占4位)。 - **示例**:`"3e8"` → `"000003e8"`。 #### **(3) 按字节反转** ```csharp PC.gReverseStringByByte(...) // 按字节反转字符串 ``` - **功能**:将字符串按每2字符(1字节)反转,调整字节序(如大端转小端)。 - **示例**:`"000003e8"` → `"e8030000"`(假设每2字符为一字节,反转后顺序为 `e8 03 00 00`)。 #### **(4) 拼接所有字段** ```csharp + PC.gReverseStringByByte(...) // 拼接其他字段(B相电压、C相电压、A/B/C相电流) + "00000000" // 附加8位零 ``` - **字段顺序**:A/B/C相电压 → A/B/C相电流 → 固定填充 `"00000000"`。 - **最终结果**:每个字段占4字节,总长度 = `6字段×4字节 + 4字节填充 = 28字节`。 --- ### **3. 逻辑流程图** ``` 数值 → 十六进制 → 填充对齐 → 字节反转 → 拼接 → 报文 ``` --- ### **4. 关键设计点** 1. **字节序调整**: - `gReverseStringByByte` 解决大小端问题,确保接收方能正确解析。 - 例如:数值 `0x12345678` 按字节反转后为 `"78563412"`(小端格式)。 2. **字段对齐**: - 每个字段固定为4字节,避免解析时长度不一致。 3. **预留字段**: - `"00000000"` 可能是占位符、校验位或保留字段。 --- ### **5. 应用场景** - **电表通信协议**: - 用于向电表发送电压、电流参数。 - 常见于电力监控系统、智能电表数据交互。 - **二进制报文构造**: - 需严格遵循字节序和字段长度要求。 --- ### **6. 潜在改进** 1. **错误处理**: - 检查数值范围(如 `iAVoltage` 是否超出有效值)。 2. **代码复用**: - 封装重复操作(如抽取公共方法 `BuildHexField(iValue)`)。 3. **常量提取**: - 将 `8`、`'0'`、`"00000000"` 定义为常量,提升可维护性。 --- ### **总结** 这段代码的核心逻辑是: 1. 将电压、电流值转为十六进制字符串。 2. 按协议要求格式化(对齐、字节序调整)。 3. 拼接成完整报文。 其设计目标是 **生成符合通信协议规范的二进制报文**,适用于电力设备数据交互等场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值