From 8c03ba25faaeca0257d8676fc3a54649f485d3ab Mon Sep 17 00:00:00 2001 From: Medithaibet <12247633+medithaibet@user.noreply.gitee.com> Date: Wed, 8 Jan 2025 20:01:26 +0800 Subject: [PATCH] =?UTF-8?q?tests=E6=96=87=E4=BB=B6=E5=A4=BE=E4=B8=8B?= =?UTF-8?q?=E6=89=80=E6=9C=89=E6=96=87=E4=BB=B6=E7=9A=84=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=8C=96(=E6=9C=AA=E6=A0=BC=E5=BC=8F=E5=8C=96GlobalUsings)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IFoxCAD.sln | 28 +- src/CADShared/PE/ProgramPE.cs | 656 +++++++++++++------ tests/TestShared/CmdINI.cs | 6 - tests/TestShared/TestAddEntity.cs | 96 +-- tests/TestShared/TestBlock.cs | 84 +-- tests/TestShared/TestCadFilePath.cs | 5 +- tests/TestShared/TestConvexHull.cs | 2 - tests/TestShared/TestCurve.cs | 30 +- tests/TestShared/TestDBTrans.cs | 15 +- tests/TestShared/TestDBobject.cs | 6 +- tests/TestShared/TestDwgMark.cs | 11 +- tests/TestShared/TestEditor.cs | 10 +- tests/TestShared/TestEntity/TestAddEntity.cs | 38 +- tests/TestShared/TestEnv.cs | 21 +- tests/TestShared/TestExtents.cs | 30 +- tests/TestShared/TestHatchinfo.cs | 3 +- tests/TestShared/TestId.cs | 4 +- tests/TestShared/TestJig.cs | 169 ++--- tests/TestShared/TestJigExTransient.cs | 5 +- tests/TestShared/TestJson.cs | 8 +- tests/TestShared/TestLayer.cs | 4 +- tests/TestShared/TestLisp.cs | 27 +- tests/TestShared/TestLoop.cs | 1 + tests/TestShared/TestMirrorFile.cs | 4 +- tests/TestShared/TestPoint.cs | 11 +- tests/TestShared/TestQuadTree.cs | 28 +- tests/TestShared/TestSelectfilter.cs | 3 - tests/TestShared/TestSingleKeyWordHook.cs | 12 +- tests/TestShared/TestText.cs | 20 +- tests/TestShared/TestXdata.cs | 16 +- tests/TestShared/Timer.cs | 19 +- tests/TestShared/Tools.cs | 4 +- 32 files changed, 778 insertions(+), 598 deletions(-) diff --git a/IFoxCAD.sln b/IFoxCAD.sln index 8b9d772..ce238bc 100644 --- a/IFoxCAD.sln +++ b/IFoxCAD.sln @@ -10,15 +10,15 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{AE09C3B7-58A EndProject Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "CADShared", "src\CADShared\CADShared.shproj", "{5178502E-9A78-4588-B849-33ED439976B2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IFoxCAD.AutoCad", "src\IFoxCAD.AutoCad\IFoxCAD.AutoCad.csproj", "{9A0A144F-6820-4D15-9D39-43B7298195E3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IFoxCAD.AutoCad", "src\IFoxCAD.AutoCad\IFoxCAD.AutoCad.csproj", "{9A0A144F-6820-4D15-9D39-43B7298195E3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IFoxCAD.ZwCad", "src\IFoxCAD.ZwCad\IFoxCAD.ZwCad.csproj", "{8546C2AC-815C-47A1-9D8C-A6470DF44AD9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IFoxCAD.ZwCad", "src\IFoxCAD.ZwCad\IFoxCAD.ZwCad.csproj", "{8546C2AC-815C-47A1-9D8C-A6470DF44AD9}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{46F3EDA8-A6D1-4707-8D03-731CADB41A56}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestAcad2025", "tests\TestAcad2025\TestAcad2025.csproj", "{47C42AB4-C2F4-475B-899C-71FDE57D926E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestAcad2025", "tests\TestAcad2025\TestAcad2025.csproj", "{47C42AB4-C2F4-475B-899C-71FDE57D926E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestZcad2025", "tests\TestZcad2025\TestZcad2025.csproj", "{0B4601B4-CBDA-4FD8-9B31-C1E292D03068}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestZcad2025", "tests\TestZcad2025\TestZcad2025.csproj", "{0B4601B4-CBDA-4FD8-9B31-C1E292D03068}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{7145708C-A65B-470E-A8DA-ED79AC9A42D7}" ProjectSection(SolutionItems) = preProject @@ -53,19 +53,23 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {57CA0128-08DE-436F-B9F1-82C64F49BF67} - EndGlobalSection - GlobalSection(SharedMSBuildProjectFiles) = preSolution - CADShared\CADShared.projitems*{5178502e-9a78-4588-b849-33ed439976b2}*SharedItemsImports = 13 - CADShared\CADShared.projitems*{6b29955a-5796-4035-9297-210fa15d3846}*SharedItemsImports = 5 - EndGlobalSection GlobalSection(NestedProjects) = preSolution + {5178502E-9A78-4588-B849-33ED439976B2} = {AE09C3B7-58AC-4A68-9884-1F93FDA5D785} {9A0A144F-6820-4D15-9D39-43B7298195E3} = {AE09C3B7-58AC-4A68-9884-1F93FDA5D785} {8546C2AC-815C-47A1-9D8C-A6470DF44AD9} = {AE09C3B7-58AC-4A68-9884-1F93FDA5D785} {47C42AB4-C2F4-475B-899C-71FDE57D926E} = {46F3EDA8-A6D1-4707-8D03-731CADB41A56} {0B4601B4-CBDA-4FD8-9B31-C1E292D03068} = {46F3EDA8-A6D1-4707-8D03-731CADB41A56} {CED63D2D-0AF6-4831-806D-5E8E9B0D0A07} = {46F3EDA8-A6D1-4707-8D03-731CADB41A56} - {5178502E-9A78-4588-B849-33ED439976B2} = {AE09C3B7-58AC-4A68-9884-1F93FDA5D785} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {57CA0128-08DE-436F-B9F1-82C64F49BF67} + EndGlobalSection + GlobalSection(SharedMSBuildProjectFiles) = preSolution + tests\TestShared\TestShared.projitems*{0b4601b4-cbda-4fd8-9b31-c1e292d03068}*SharedItemsImports = 5 + tests\TestShared\TestShared.projitems*{47c42ab4-c2f4-475b-899c-71fde57d926e}*SharedItemsImports = 5 + src\CADShared\CADShared.projitems*{5178502e-9a78-4588-b849-33ed439976b2}*SharedItemsImports = 13 + src\CADShared\CADShared.projitems*{8546c2ac-815c-47a1-9d8c-a6470df44ad9}*SharedItemsImports = 5 + src\CADShared\CADShared.projitems*{9a0a144f-6820-4d15-9d39-43b7298195e3}*SharedItemsImports = 5 + tests\TestShared\TestShared.projitems*{ced63d2d-0af6-4831-806d-5e8e9b0d0a07}*SharedItemsImports = 13 EndGlobalSection EndGlobal diff --git a/src/CADShared/PE/ProgramPE.cs b/src/CADShared/PE/ProgramPE.cs index fc9587d..138bba6 100644 --- a/src/CADShared/PE/ProgramPE.cs +++ b/src/CADShared/PE/ProgramPE.cs @@ -8,7 +8,6 @@ namespace IFoxCAD.Cad; using System.IO; using System.Text; - /* 来源 https://blog.csdn.net/zgke/article/details/2955560 我在他基础上面增加了X64的处理 * 调用例子 static void Main(string[] args) @@ -54,12 +53,14 @@ public class PeInfo public OptionalHeader? OptionalHeader { get; private set; } public OptionalDirAttrib? OptionalDirAttrib { get; private set; } public SectionTable? SectionTable { get; private set; } + /// /// 函数接口名单 /// public ExportDirectory? ExportDirectory { get; private set; } public ImportDirectory? ImportDirectory { get; private set; } public ResourceDirectory? ResourceDirectory { get; private set; } + /// /// PE文件完整路径 /// @@ -71,6 +72,7 @@ public class PeInfo /// 全部文件数据 /// readonly byte[]? _PEFileByte; + /// /// 文件读取的位置 /// @@ -94,13 +96,16 @@ public PeInfo(string fullName) try { // 文件流 - file = new FileStream(fullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);// FileShare才能进c盘 + file = new FileStream(fullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); // FileShare才能进c盘 _PEFileByte = new byte[file.Length]; - file.Read(_PEFileByte, 0, _PEFileByte.Length); + //file.Read(_PEFileByte, 0, _PEFileByte.Length); LoadFile(); OpenFile = true; } - catch (Exception) { throw; } + catch (Exception) + { + throw; + } finally { file?.Close(); @@ -114,14 +119,14 @@ public PeInfo(string fullName) /// private void LoadFile() { - LoadDosHeader(); // 获取DOS头,为了兼容DOS所以首先处理这个,然后才到PE头 - LoadDosStub(); // 获取DOS的身体 - LoadPEHeader(); // PE头 - LoadOptionalHeader(); // PE头扩展 + LoadDosHeader(); // 获取DOS头,为了兼容DOS所以首先处理这个,然后才到PE头 + LoadDosStub(); // 获取DOS的身体 + LoadPEHeader(); // PE头 + LoadOptionalHeader(); // PE头扩展 LoadOptionalDirAttrib(); // 获取选项目录属性 - LoadSectionTable(); // 获取节表 - LoadExportDirectory(); // 获取输出表 - LoadImportDirectory(); // 获取输入表 + LoadSectionTable(); // 获取节表 + LoadExportDirectory(); // 获取输出表 + LoadImportDirectory(); // 获取输入表 LoadResourceDirectory(); // 获取资源目录 } @@ -130,10 +135,7 @@ private void LoadFile() /// private void LoadDosHeader() { - DosHeader = new DosHeader - { - FileStarIndex = _PEFileIndex - }; + DosHeader = new DosHeader { FileStarIndex = _PEFileIndex }; Loadbyte(ref DosHeader.e_magic); Loadbyte(ref DosHeader.e_cblp); Loadbyte(ref DosHeader.e_cp); @@ -165,11 +167,8 @@ private void LoadDosStub() if (DosHeader is null) return; - var Size = GetLong(DosHeader.e_PESTAR) - _PEFileIndex; // 获得SUB的大小 - DosStub = new DosStub(Size) - { - FileStarIndex = _PEFileIndex - }; + var Size = GetLong(DosHeader.e_PESTAR) - _PEFileIndex; // 获得SUB的大小 + DosStub = new DosStub(Size) { FileStarIndex = _PEFileIndex }; Loadbyte(ref DosStub.DosStubData); DosStub.FileEndIndex = _PEFileIndex; } @@ -180,12 +179,9 @@ private void LoadDosStub() /// private void LoadPEHeader() { - PEHeader = new PEHeader - { - FileStarIndex = _PEFileIndex - }; + PEHeader = new PEHeader { FileStarIndex = _PEFileIndex }; Loadbyte(ref PEHeader.Header); - Loadbyte(ref PEHeader.Machine);// [76 1]==[0x4C 1]是x32, + Loadbyte(ref PEHeader.Machine); // [76 1]==[0x4C 1]是x32, _IsX86 = PEHeader.Machine[0] == 0x4c && PEHeader.Machine[1] == 0x1; // (PEHeader.Machine[0] == 0x64 && PEHeader.Machine[1] == 0x86)// x64 Loadbyte(ref PEHeader.NumberOfSections); @@ -204,10 +200,7 @@ private void LoadPEHeader() private void LoadOptionalHeader() { // 这里必须通过PE文件来判断它是一个什么架构,从而使用x86-x64 - OptionalHeader = new OptionalHeader(_IsX86) - { - FileStarIndex = _PEFileIndex - }; + OptionalHeader = new OptionalHeader(_IsX86) { FileStarIndex = _PEFileIndex }; Loadbyte(ref OptionalHeader.Magic); Loadbyte(ref OptionalHeader.MajorLinkerVersion); Loadbyte(ref OptionalHeader.MinorLinkerVersion); @@ -252,12 +245,9 @@ private void LoadOptionalDirAttrib() if (OptionalHeader is null) return; - OptionalDirAttrib = new OptionalDirAttrib - { - FileStarIndex = _PEFileIndex - }; + OptionalDirAttrib = new OptionalDirAttrib { FileStarIndex = _PEFileIndex }; - var DirCount = GetLong(OptionalHeader.NumberOfRvaAndSizes);// 这里导致无法使用64位 + var DirCount = GetLong(OptionalHeader.NumberOfRvaAndSizes); // 这里导致无法使用64位 for (var i = 0; i != DirCount; i++) { OptionalDirAttrib.DirAttrib? directAttrib = new(); @@ -308,11 +298,13 @@ private void LoadExportDirectory() if (OptionalDirAttrib.DirByte.Count == 0) return; - if (OptionalDirAttrib.DirByte[0] is not OptionalDirAttrib.DirAttrib exporRVA || - GetLong(exporRVA.DirRva) == 0) + if ( + OptionalDirAttrib.DirByte[0] is not OptionalDirAttrib.DirAttrib exporRVA + || GetLong(exporRVA.DirRva) == 0 + ) return; - var exporAddress = GetLong(exporRVA.DirRva); // 获取的位置 + var exporAddress = GetLong(exporRVA.DirRva); // 获取的位置 ExportDirectory = new ExportDirectory(); if (SectionTable is null) @@ -328,7 +320,8 @@ private void LoadExportDirectory() if (exporAddress >= starRva && exporAddress < starRva + endRva) { - _PEFileIndex = exporAddress - GetLong(sect.SizeOfRawDataRVA) + GetLong(sect.PointerToRawData); + _PEFileIndex = + exporAddress - GetLong(sect.SizeOfRawDataRVA) + GetLong(sect.PointerToRawData); ExportDirectory.FileStarIndex = _PEFileIndex; ExportDirectory.FileEndIndex = _PEFileIndex + GetLong(exporRVA.DirSize); @@ -345,8 +338,14 @@ private void LoadExportDirectory() Loadbyte(ref ExportDirectory.AddressOfNames); Loadbyte(ref ExportDirectory.AddressOfNameOrdinals); - _PEFileIndex = GetLong(ExportDirectory.AddressOfFunctions) - GetLong(sect.SizeOfRawDataRVA) + GetLong(sect.PointerToRawData); - var endIndex = GetLong(ExportDirectory.AddressOfNames) - GetLong(sect.SizeOfRawDataRVA) + GetLong(sect.PointerToRawData); + _PEFileIndex = + GetLong(ExportDirectory.AddressOfFunctions) + - GetLong(sect.SizeOfRawDataRVA) + + GetLong(sect.PointerToRawData); + var endIndex = + GetLong(ExportDirectory.AddressOfNames) + - GetLong(sect.SizeOfRawDataRVA) + + GetLong(sect.PointerToRawData); var numb = (endIndex - _PEFileIndex) / 4; for (long z = 0; z != numb; z++) { @@ -356,7 +355,10 @@ private void LoadExportDirectory() } _PEFileIndex = endIndex; - endIndex = GetLong(ExportDirectory.AddressOfNameOrdinals) - GetLong(sect.SizeOfRawDataRVA) + GetLong(sect.PointerToRawData); + endIndex = + GetLong(ExportDirectory.AddressOfNameOrdinals) + - GetLong(sect.SizeOfRawDataRVA) + + GetLong(sect.PointerToRawData); numb = (endIndex - _PEFileIndex) / 4; for (long z = 0; z != numb; z++) { @@ -366,7 +368,10 @@ private void LoadExportDirectory() } _PEFileIndex = endIndex; - endIndex = GetLong(ExportDirectory.Name) - GetLong(sect.SizeOfRawDataRVA) + GetLong(sect.PointerToRawData); + endIndex = + GetLong(ExportDirectory.Name) + - GetLong(sect.SizeOfRawDataRVA) + + GetLong(sect.PointerToRawData); numb = (endIndex - _PEFileIndex) / 2; for (long z = 0; z != numb; z++) { @@ -414,10 +419,10 @@ private void LoadImportDirectory() if (OptionalDirAttrib.DirByte[1] is not OptionalDirAttrib.DirAttrib ImporRVA) return; - var ImporAddress = GetLong(ImporRVA.DirRva); // 获取的位置 + var ImporAddress = GetLong(ImporRVA.DirRva); // 获取的位置 if (ImporAddress == 0) return; - var ImporSize = GetLong(ImporRVA.DirSize); // 获取大小 + var ImporSize = GetLong(ImporRVA.DirSize); // 获取大小 ImportDirectory = new ImportDirectory(); @@ -472,7 +477,7 @@ private void LoadImportDirectory() #region 获取输入DLL名称 - for (var z = 0; z != ImportDirectory.ImportList.Count; z++) // 获取引入DLL名字 + for (var z = 0; z != ImportDirectory.ImportList.Count; z++) // 获取引入DLL名字 { if (ImportDirectory.ImportList[z] is not ImportDirectory.ImportDate Import) continue; @@ -494,7 +499,7 @@ private void LoadImportDirectory() #endregion #region 获取引入方法 先获取地址 然后获取名字和头 - for (var z = 0; z != ImportDirectory.ImportList.Count; z++) // 获取引入方法 + for (var z = 0; z != ImportDirectory.ImportList.Count; z++) // 获取引入方法 { if (ImportDirectory.ImportList[z] is not ImportDirectory.ImportDate import) continue; @@ -513,7 +518,7 @@ private void LoadImportDirectory() _PEFileIndex = loadIndex - SizeRva + PointerRva; - if (loadIndex >= StarRva && loadIndex < StarRva + EndRva) // 发现有些数字超级大 + if (loadIndex >= StarRva && loadIndex < StarRva + EndRva) // 发现有些数字超级大 { var ReadCount = 0; @@ -555,10 +560,10 @@ private void LoadResourceDirectory() if (OptionalDirAttrib.DirByte[2] is not OptionalDirAttrib.DirAttrib ImporRVA) return; - var ImporAddress = GetLong(ImporRVA.DirRva); // 获取的位置 + var ImporAddress = GetLong(ImporRVA.DirRva); // 获取的位置 if (ImporAddress == 0) return; - var ImporSize = GetLong(ImporRVA.DirSize); // 获取大小 + var ImporSize = GetLong(ImporRVA.DirSize); // 获取大小 ResourceDirectory = new ResourceDirectory(); @@ -607,7 +612,7 @@ private void LoadResourceDirectory() /// private void AddResourceNode(ResourceDirectory node, long PEIndex, long RVA, long resourSectRva) { - _PEFileIndex = PEIndex + RVA; // 设置位置 + _PEFileIndex = PEIndex + RVA; // 设置位置 Loadbyte(ref node.Characteristics); Loadbyte(ref node.TimeDateStamp); Loadbyte(ref node.MajorVersion); @@ -742,6 +747,7 @@ private void Loadbyte(ref byte[] data) _PEFileIndex++; } } + /// /// 转换byte为字符串 /// @@ -757,6 +763,7 @@ private string GetString(byte[] data) // Temp += data[^1].ToString("X02"); return Temp; } + /// /// 转换字符为显示数据 /// @@ -781,6 +788,7 @@ private string GetString(byte[] data, string type) } return GetInt(data); } + /// /// 转换BYTE为INT /// @@ -799,6 +807,7 @@ static string GetInt(byte[] data) Temp += EndByteInt.ToString(); return Temp; } + /// /// 转换数据为LONG /// @@ -815,6 +824,7 @@ private long GetLong(byte[] data) MC += data[i].ToString("X02"); return Convert.ToInt64(MC, 16); } + /// /// 添加一行信息 /// @@ -830,13 +840,14 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d refTable.Rows.Add( new string[] { - name, - data.Length.ToString(), - GetString(data), - GetLong(data).ToString(), - GetString(data,"ASCII"), - describe - }); + name, + data.Length.ToString(), + GetString(data), + GetLong(data).ToString(), + GetString(data, "ASCII"), + describe, + } + ); } #endregion @@ -867,7 +878,6 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d if (a5 is not null) ds.Tables.Add(a5); - var a6 = TableExportDirectory(); var a7 = TableExportFunction(); if (a6 is not null) @@ -894,7 +904,13 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d if (DosHeader is null) return null; - var returnTable = new DataTable("DosHeader FileStar{" + DosHeader.FileStarIndex.ToString() + "}FileEnd{" + DosHeader.FileEndIndex.ToString() + "}"); + var returnTable = new DataTable( + "DosHeader FileStar{" + + DosHeader.FileStarIndex.ToString() + + "}FileEnd{" + + DosHeader.FileEndIndex.ToString() + + "}" + ); returnTable.Columns.Add("Name"); returnTable.Columns.Add("Size"); returnTable.Columns.Add("Value16"); @@ -930,7 +946,13 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d if (PEHeader is null) return null; - var returnTable = new DataTable("PeHeader FileStar{" + PEHeader.FileStarIndex.ToString() + "}FileEnd{" + PEHeader.FileEndIndex.ToString() + "}"); + var returnTable = new DataTable( + "PeHeader FileStar{" + + PEHeader.FileStarIndex.ToString() + + "}FileEnd{" + + PEHeader.FileEndIndex.ToString() + + "}" + ); returnTable.Columns.Add("Name"); returnTable.Columns.Add("Size"); returnTable.Columns.Add("Value16"); @@ -938,15 +960,39 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d returnTable.Columns.Add("ASCII"); returnTable.Columns.Add("Describe"); - AddTableRow(returnTable, PEHeader.Header, "Header", "PE文件标记"); - AddTableRow(returnTable, PEHeader.Machine, "Machine", "该文件运行所要求的CPU.对于Intel平台,该值是IMAGE_FILE_MACHINE_I386 (14Ch).我们尝试了LUEVELSMEYER的pe.txt声明的14Dh和14Eh,但Windows不能正确执行. "); - AddTableRow(returnTable, PEHeader.NumberOfSections, "NumberOfSections", "文件的节数目.如果我们要在文件中增加或删除一个节,就需要修改这个值."); + AddTableRow( + returnTable, + PEHeader.Machine, + "Machine", + "该文件运行所要求的CPU.对于Intel平台,该值是IMAGE_FILE_MACHINE_I386 (14Ch).我们尝试了LUEVELSMEYER的pe.txt声明的14Dh和14Eh,但Windows不能正确执行. " + ); + AddTableRow( + returnTable, + PEHeader.NumberOfSections, + "NumberOfSections", + "文件的节数目.如果我们要在文件中增加或删除一个节,就需要修改这个值." + ); AddTableRow(returnTable, PEHeader.TimeDateStamp, "TimeDateStamp", "文件创建日期和时间. "); - AddTableRow(returnTable, PEHeader.PointerToSymbolTable, "PointerToSymbolTable", "用于调试. "); + AddTableRow( + returnTable, + PEHeader.PointerToSymbolTable, + "PointerToSymbolTable", + "用于调试. " + ); AddTableRow(returnTable, PEHeader.NumberOfSymbols, "NumberOfSymbols", "用于调试. "); - AddTableRow(returnTable, PEHeader.SizeOfOptionalHeader, "SizeOfOptionalHeader", "指示紧随本结构之后的 OptionalHeader 结构大小,必须为有效值."); - AddTableRow(returnTable, PEHeader.Characteristics, "Characteristics", "关于文件信息的标记,比如文件是exe还是dll."); + AddTableRow( + returnTable, + PEHeader.SizeOfOptionalHeader, + "SizeOfOptionalHeader", + "指示紧随本结构之后的 OptionalHeader 结构大小,必须为有效值." + ); + AddTableRow( + returnTable, + PEHeader.Characteristics, + "Characteristics", + "关于文件信息的标记,比如文件是exe还是dll." + ); return returnTable; } @@ -956,7 +1002,13 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d if (OptionalHeader is null) return null; - var returnTable = new DataTable("OptionalHeader FileStar{" + OptionalHeader.FileStarIndex.ToString() + "}FileEnd{" + OptionalHeader.FileEndIndex.ToString() + "}"); + var returnTable = new DataTable( + "OptionalHeader FileStar{" + + OptionalHeader.FileStarIndex.ToString() + + "}FileEnd{" + + OptionalHeader.FileEndIndex.ToString() + + "}" + ); returnTable.Columns.Add("Name"); returnTable.Columns.Add("Size"); returnTable.Columns.Add("Value16"); @@ -964,13 +1016,43 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d returnTable.Columns.Add("ASCII"); returnTable.Columns.Add("Describe"); - AddTableRow(returnTable, OptionalHeader.Magic, "Magic", "Magic 010B=普通可以执行,0107=ROM映像"); - AddTableRow(returnTable, OptionalHeader.MajorLinkerVersion, "MajorLinkerVersion", "主版本号"); - AddTableRow(returnTable, OptionalHeader.MinorLinkerVersion, "MinorLinkerVersion", "副版本号"); + AddTableRow( + returnTable, + OptionalHeader.Magic, + "Magic", + "Magic 010B=普通可以执行,0107=ROM映像" + ); + AddTableRow( + returnTable, + OptionalHeader.MajorLinkerVersion, + "MajorLinkerVersion", + "主版本号" + ); + AddTableRow( + returnTable, + OptionalHeader.MinorLinkerVersion, + "MinorLinkerVersion", + "副版本号" + ); AddTableRow(returnTable, OptionalHeader.SizeOfCode, "SizeOfCode", "代码段大小"); - AddTableRow(returnTable, OptionalHeader.SizeOfInitializedData, "SizeOfInitializedData", "已初始化数据大小"); - AddTableRow(returnTable, OptionalHeader.SizeOfUninitializedData, "SizeOfUninitializedData", "未初始化数据大小"); - AddTableRow(returnTable, OptionalHeader.AddressOfEntryPoint, "AddressOfEntryPoint", "执行将从这里开始(RVA)"); + AddTableRow( + returnTable, + OptionalHeader.SizeOfInitializedData, + "SizeOfInitializedData", + "已初始化数据大小" + ); + AddTableRow( + returnTable, + OptionalHeader.SizeOfUninitializedData, + "SizeOfUninitializedData", + "未初始化数据大小" + ); + AddTableRow( + returnTable, + OptionalHeader.AddressOfEntryPoint, + "AddressOfEntryPoint", + "执行将从这里开始(RVA)" + ); AddTableRow(returnTable, OptionalHeader.BaseOfCode, "BaseOfCode", "代码基址(RVA)"); AddTableRow(returnTable, OptionalHeader.ImageBase, "ImageBase", "数据基址(RVA)"); if (_IsX86) @@ -978,22 +1060,67 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d AddTableRow(returnTable, OptionalHeader.BaseOfData, "ImageFileCode", "映象文件基址"); } AddTableRow(returnTable, OptionalHeader.SectionAlignment, "SectionAlign", "区段列队"); - AddTableRow(returnTable, OptionalHeader.MajorOperatingSystemVersion, "MajorOSV", "文件列队"); - AddTableRow(returnTable, OptionalHeader.MinorOperatingSystemVersion, "MinorOSV", "操作系统主版本号"); - AddTableRow(returnTable, OptionalHeader.MajorImageVersion, "MajorImageVer", "映象文件主版本号"); - AddTableRow(returnTable, OptionalHeader.MinorImageVersion, "MinorImageVer", "映象文件副版本号"); - AddTableRow(returnTable, OptionalHeader.MajorSubsystemVersion, "MajorSV", "子操作系统主版本号"); - AddTableRow(returnTable, OptionalHeader.MinorSubsystemVersion, "MinorSV", "子操作系统副版本号"); + AddTableRow( + returnTable, + OptionalHeader.MajorOperatingSystemVersion, + "MajorOSV", + "文件列队" + ); + AddTableRow( + returnTable, + OptionalHeader.MinorOperatingSystemVersion, + "MinorOSV", + "操作系统主版本号" + ); + AddTableRow( + returnTable, + OptionalHeader.MajorImageVersion, + "MajorImageVer", + "映象文件主版本号" + ); + AddTableRow( + returnTable, + OptionalHeader.MinorImageVersion, + "MinorImageVer", + "映象文件副版本号" + ); + AddTableRow( + returnTable, + OptionalHeader.MajorSubsystemVersion, + "MajorSV", + "子操作系统主版本号" + ); + AddTableRow( + returnTable, + OptionalHeader.MinorSubsystemVersion, + "MinorSV", + "子操作系统副版本号" + ); AddTableRow(returnTable, OptionalHeader.Win32VersionValue, "UNKNOW", "Win32版本值"); AddTableRow(returnTable, OptionalHeader.SizeOfImage, "SizeOfImage", "映象文件大小"); AddTableRow(returnTable, OptionalHeader.SizeOfHeards, "SizeOfHeards", "标志头大小"); AddTableRow(returnTable, OptionalHeader.CheckSum, "CheckSum", "文件效验"); - AddTableRow(returnTable, OptionalHeader.Subsystem, "Subsystem", "子系统(映象文件)1本地 2WINDOWS-GUI 3WINDOWS-CUI 4 POSIX-CUI"); - AddTableRow(returnTable, OptionalHeader.DLLCharacteristics, "DLL_Characteristics", "DLL标记"); + AddTableRow( + returnTable, + OptionalHeader.Subsystem, + "Subsystem", + "子系统(映象文件)1本地 2WINDOWS-GUI 3WINDOWS-CUI 4 POSIX-CUI" + ); + AddTableRow( + returnTable, + OptionalHeader.DLLCharacteristics, + "DLL_Characteristics", + "DLL标记" + ); AddTableRow(returnTable, OptionalHeader.SizeOfStackReserve, "Bsize", "保留栈的大小"); AddTableRow(returnTable, OptionalHeader.SizeOfStackCommit, "TimeBsize", "初始时指定栈大小"); AddTableRow(returnTable, OptionalHeader.SizeOfHeapReserve, "AucBsize", "保留堆的大小"); - AddTableRow(returnTable, OptionalHeader.SizeOfHeapCommit, "SizeOfBsize", "初始时指定堆大小"); + AddTableRow( + returnTable, + OptionalHeader.SizeOfHeapCommit, + "SizeOfBsize", + "初始时指定堆大小" + ); AddTableRow(returnTable, OptionalHeader.LoaderFlags, "FuckBsize", "加载器标志"); AddTableRow(returnTable, OptionalHeader.NumberOfRvaAndSizes, "DirectCount", "数据目录数"); @@ -1007,10 +1134,11 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d var returnTable = new DataTable( "OptionalDirAttrib FileStar{" - + OptionalDirAttrib.FileStarIndex.ToString() - + "}FileEnd{" - + OptionalDirAttrib.FileEndIndex.ToString() - + "}"); + + OptionalDirAttrib.FileStarIndex.ToString() + + "}FileEnd{" + + OptionalDirAttrib.FileEndIndex.ToString() + + "}" + ); returnTable.Columns.Add("Name"); returnTable.Columns.Add("Size"); returnTable.Columns.Add("Value16"); @@ -1035,7 +1163,7 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d { 12, "其他表2" }, { 13, "其他表3" }, { 14, "其他表4" }, - { 15, "其他表5" } + { 15, "其他表5" }, }; for (var i = 0; i != OptionalDirAttrib.DirByte.Count; i++) @@ -1062,10 +1190,11 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d var returnTable = new DataTable( "SectionData FileStar{" - + SectionTable.FileStarIndex.ToString() - + "}FileEnd{" - + SectionTable.FileEndIndex.ToString() - + "}"); + + SectionTable.FileStarIndex.ToString() + + "}FileEnd{" + + SectionTable.FileEndIndex.ToString() + + "}" + ); returnTable.Columns.Add("Name"); returnTable.Columns.Add("Size"); returnTable.Columns.Add("Value16"); @@ -1082,11 +1211,36 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d AddTableRow(returnTable, SectionDate.VirtualAddress, "VirtualAddress", "虚拟内存地址"); AddTableRow(returnTable, SectionDate.SizeOfRawDataRVA, "SizeOfRawDataRVA", "RVA偏移"); AddTableRow(returnTable, SectionDate.SizeOfRawDataSize, "SizeOfRawDataSize", "RVA大小"); - AddTableRow(returnTable, SectionDate.PointerToRawData, "PointerToRawData", "指向RAW数据"); - AddTableRow(returnTable, SectionDate.PointerToRelocations, "PointerToRelocations", "指向定位号"); - AddTableRow(returnTable, SectionDate.PointerToLinenumbers, "PointerToLinenumbers", "指向行数"); - AddTableRow(returnTable, SectionDate.NumberOfRelocations, "NumberOfRelocations", "定位号"); - AddTableRow(returnTable, SectionDate.NumberOfLinenumbers, "NumberOfLinenumbers", "行数号"); + AddTableRow( + returnTable, + SectionDate.PointerToRawData, + "PointerToRawData", + "指向RAW数据" + ); + AddTableRow( + returnTable, + SectionDate.PointerToRelocations, + "PointerToRelocations", + "指向定位号" + ); + AddTableRow( + returnTable, + SectionDate.PointerToLinenumbers, + "PointerToLinenumbers", + "指向行数" + ); + AddTableRow( + returnTable, + SectionDate.NumberOfRelocations, + "NumberOfRelocations", + "定位号" + ); + AddTableRow( + returnTable, + SectionDate.NumberOfLinenumbers, + "NumberOfLinenumbers", + "行数号" + ); AddTableRow(returnTable, SectionDate.Characteristics, "Characteristics", "区段标记"); } return returnTable; @@ -1099,10 +1253,11 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d var returnTable = new DataTable( "ExportDirectory FileStar{" - + ExportDirectory.FileStarIndex.ToString() - + "}FileEnd{" - + ExportDirectory.FileEndIndex.ToString() - + "}"); + + ExportDirectory.FileStarIndex.ToString() + + "}FileEnd{" + + ExportDirectory.FileEndIndex.ToString() + + "}" + ); returnTable.Columns.Add("Name"); returnTable.Columns.Add("Size"); returnTable.Columns.Add("Value16"); @@ -1110,20 +1265,56 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d returnTable.Columns.Add("ASCII"); returnTable.Columns.Add("Describe"); - AddTableRow(returnTable, ExportDirectory.Characteristics, "Characteristics", "一个保留字段,目前为止值为0."); + AddTableRow( + returnTable, + ExportDirectory.Characteristics, + "Characteristics", + "一个保留字段,目前为止值为0." + ); AddTableRow(returnTable, ExportDirectory.TimeDateStamp, "TimeDateStamp", "产生的时间."); AddTableRow(returnTable, ExportDirectory.MajorVersion, "MajorVersion", "主版本号"); AddTableRow(returnTable, ExportDirectory.MinorVersion, "MinorVersion", "副版本号"); - AddTableRow(returnTable, ExportDirectory.Name, "Name", "一个RVA,指向一个dll的名称的ascii字符串."); + AddTableRow( + returnTable, + ExportDirectory.Name, + "Name", + "一个RVA,指向一个dll的名称的ascii字符串." + ); AddTableRow(returnTable, ExportDirectory.Base, "Base", "输出函数的起始序号.一般为1."); - AddTableRow(returnTable, ExportDirectory.NumberOfFunctions, "NumberOfFunctions", "输出函数入口地址的数组 中的元素个数."); - AddTableRow(returnTable, ExportDirectory.NumberOfNames, "NumberOfNames", "输出函数名的指针的数组 中的元素个数,也是输出函数名对应的序号的数组 中的元素个数."); - AddTableRow(returnTable, ExportDirectory.AddressOfFunctions, "AddressOfFunctions", "一个RVA,指向输出函数入口地址的数组."); - AddTableRow(returnTable, ExportDirectory.AddressOfNames, "AddressOfNames", "一个RVA,指向输出函数名的指针的数组."); - AddTableRow(returnTable, ExportDirectory.AddressOfNameOrdinals, "AddressOfNameOrdinals", "一个RVA,指向输出函数名对应的序号的数组."); + AddTableRow( + returnTable, + ExportDirectory.NumberOfFunctions, + "NumberOfFunctions", + "输出函数入口地址的数组 中的元素个数." + ); + AddTableRow( + returnTable, + ExportDirectory.NumberOfNames, + "NumberOfNames", + "输出函数名的指针的数组 中的元素个数,也是输出函数名对应的序号的数组 中的元素个数." + ); + AddTableRow( + returnTable, + ExportDirectory.AddressOfFunctions, + "AddressOfFunctions", + "一个RVA,指向输出函数入口地址的数组." + ); + AddTableRow( + returnTable, + ExportDirectory.AddressOfNames, + "AddressOfNames", + "一个RVA,指向输出函数名的指针的数组." + ); + AddTableRow( + returnTable, + ExportDirectory.AddressOfNameOrdinals, + "AddressOfNameOrdinals", + "一个RVA,指向输出函数名对应的序号的数组." + ); return returnTable; } + private DataTable? TableExportFunction() { if (ExportDirectory is null) @@ -1139,10 +1330,12 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d for (var i = 0; i != ExportDirectory.FunctionNamesByte.Count; i++) { - AddTableRow(returnTable, + AddTableRow( + returnTable, ExportDirectory.FunctionNamesByte[i], "Name", - "_ExportDirectory.Name-Sect.SizeOfRawDataRVA+Sect.PointerToRawData"); + "_ExportDirectory.Name-Sect.SizeOfRawDataRVA+Sect.PointerToRawData" + ); } for (var i = 0; i != ExportDirectory.AddressOfNamesList.Count; i++) @@ -1167,12 +1360,19 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d } return returnTable; } + private DataTable? TableImportDirectory() { if (ImportDirectory is null) return null; - var returnTable = new DataTable("ImportDirectory FileStar{" + ImportDirectory.FileStarIndex.ToString() + "}FileEnd{" + ImportDirectory.FileEndIndex.ToString() + "}"); + var returnTable = new DataTable( + "ImportDirectory FileStar{" + + ImportDirectory.FileStarIndex.ToString() + + "}FileEnd{" + + ImportDirectory.FileEndIndex.ToString() + + "}" + ); returnTable.Columns.Add("Name"); returnTable.Columns.Add("Size"); returnTable.Columns.Add("Value16"); @@ -1186,15 +1386,36 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d continue; AddTableRow(returnTable, ImportByte.DLLName, "输入DLL名称", "**********"); - AddTableRow(returnTable, ImportByte.OriginalFirstThunk, "OriginalFirstThunk", "这里实际上保存着一个RVA,这个RVA指向一个DWORD数组,这个数组可以叫做输入查询表.每个数组元素,或者叫一个表项,保存着一个指向函数名的RVA或者保存着一个函数的序号."); - AddTableRow(returnTable, ImportByte.TimeDateStamp, "TimeDateStamp", "当这个值为0的时候,表明还没有bind.不为0的话,表示已经bind过了.有关bind的内容后面介绍."); + AddTableRow( + returnTable, + ImportByte.OriginalFirstThunk, + "OriginalFirstThunk", + "这里实际上保存着一个RVA,这个RVA指向一个DWORD数组,这个数组可以叫做输入查询表.每个数组元素,或者叫一个表项,保存着一个指向函数名的RVA或者保存着一个函数的序号." + ); + AddTableRow( + returnTable, + ImportByte.TimeDateStamp, + "TimeDateStamp", + "当这个值为0的时候,表明还没有bind.不为0的话,表示已经bind过了.有关bind的内容后面介绍." + ); AddTableRow(returnTable, ImportByte.ForwarderChain, "ForwarderChain", ""); - AddTableRow(returnTable, ImportByte.Name, "Name", "一个RVA,这个RVA指向一个ascii以空字符结束的字符串,这个字符串就是本结构对应的dll文件的名字."); - AddTableRow(returnTable, ImportByte.FirstThunk, "FirstThunk", "一个RVA,这个RVA指向一个DWORD数组,这个数组可以叫输入地址表.如果bind了的话,这个数组的每个元素,就是一个输入函数的入口地址."); + AddTableRow( + returnTable, + ImportByte.Name, + "Name", + "一个RVA,这个RVA指向一个ascii以空字符结束的字符串,这个字符串就是本结构对应的dll文件的名字." + ); + AddTableRow( + returnTable, + ImportByte.FirstThunk, + "FirstThunk", + "一个RVA,这个RVA指向一个DWORD数组,这个数组可以叫输入地址表.如果bind了的话,这个数组的每个元素,就是一个输入函数的入口地址." + ); } return returnTable; } + private DataTable? TableImportFunction() { if (ImportDirectory is null) @@ -1217,7 +1438,10 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d for (var z = 0; z != ImportByte.DLLFunctionList.Count; z++) { - if (ImportByte.DLLFunctionList[z] is not ImportDirectory.ImportDate.FunctionList Function) + if ( + ImportByte.DLLFunctionList[z] + is not ImportDirectory.ImportDate.FunctionList Function + ) continue; AddTableRow(returnTable, Function.FunctionName, "FunctionName", ""); @@ -1227,17 +1451,25 @@ private void AddTableRow(DataTable refTable, byte[]? data, string name, string d } return returnTable; } + private DataTable? TableResourceDirectory() { if (ResourceDirectory is null) return null; - var returnTable = new DataTable("ResourceDirectory FileStar{" + ResourceDirectory.FileStarIndex.ToString() + "}FileEnd{" + ResourceDirectory.FileEndIndex.ToString() + "}"); + var returnTable = new DataTable( + "ResourceDirectory FileStar{" + + ResourceDirectory.FileStarIndex.ToString() + + "}FileEnd{" + + ResourceDirectory.FileEndIndex.ToString() + + "}" + ); returnTable.Columns.Add("GUID"); returnTable.Columns.Add("Text"); returnTable.Columns.Add("ParentID"); AddResourceDirectoryRow(returnTable, ResourceDirectory, ""); return returnTable; } + private void AddResourceDirectoryRow(DataTable myTable, ResourceDirectory Node, string parentID) { var Name = ""; @@ -1288,7 +1520,16 @@ private void AddResourceDirectoryRow(DataTable myTable, ResourceDirectory Node, if (Entry.DataEntryList[z] is not ResourceDirectory.DirectoryEntry.DataEntry Data) continue; - var Text = "Address{" + GetString(Data.ResourRVA) + "} Size{" + GetString(Data.ResourSize) + "} FileBegin{" + Data.FileStarIndex.ToString() + "-" + Data.FileEndIndex.ToString() + "}"; + var Text = + "Address{" + + GetString(Data.ResourRVA) + + "} Size{" + + GetString(Data.ResourSize) + + "} FileBegin{" + + Data.FileStarIndex.ToString() + + "-" + + Data.FileEndIndex.ToString() + + "}"; myTable.Rows.Add(new string[] { Guid.NewGuid().ToString(), Text, GUID }); } @@ -1310,25 +1551,25 @@ private void AddResourceDirectoryRow(DataTable myTable, ResourceDirectory Node, /// public class DosHeader // IMAGE_DOS_HEADER { - public byte[] e_magic = new byte[2]; // 魔术数字 - public byte[] e_cblp = new byte[2]; // 文件最后页的字节数 - public byte[] e_cp = new byte[2]; // 文件页数 - public byte[] e_crlc = new byte[2]; // 重定义元素个数 - public byte[] e_cparhdr = new byte[2]; // 头部尺寸,以段落为单位 - public byte[] e_minalloc = new byte[2]; // 所需的最小附加段 - public byte[] e_maxalloc = new byte[2]; // 所需的最大附加段 - public byte[] e_ss = new byte[2]; // 初始的SS值(相对偏移量) - public byte[] e_sp = new byte[2]; // 初始的SP值 - public byte[] e_csum = new byte[2]; // 校验和 - public byte[] e_ip = new byte[2]; // 初始的IP值 - public byte[] e_cs = new byte[2]; // 初始的CS值(相对偏移量) + public byte[] e_magic = new byte[2]; // 魔术数字 + public byte[] e_cblp = new byte[2]; // 文件最后页的字节数 + public byte[] e_cp = new byte[2]; // 文件页数 + public byte[] e_crlc = new byte[2]; // 重定义元素个数 + public byte[] e_cparhdr = new byte[2]; // 头部尺寸,以段落为单位 + public byte[] e_minalloc = new byte[2]; // 所需的最小附加段 + public byte[] e_maxalloc = new byte[2]; // 所需的最大附加段 + public byte[] e_ss = new byte[2]; // 初始的SS值(相对偏移量) + public byte[] e_sp = new byte[2]; // 初始的SP值 + public byte[] e_csum = new byte[2]; // 校验和 + public byte[] e_ip = new byte[2]; // 初始的IP值 + public byte[] e_cs = new byte[2]; // 初始的CS值(相对偏移量) public byte[] e_rva = new byte[2]; public byte[] e_fg = new byte[2]; public byte[] e_bl1 = new byte[8]; public byte[] e_oemid = new byte[2]; public byte[] e_oeminfo = new byte[2]; public byte[] e_bl2 = new byte[20]; - public byte[] e_PESTAR = new byte[2]; // PE开始 +自己的位置........重点 + public byte[] e_PESTAR = new byte[2]; // PE开始 +自己的位置........重点 public long FileStarIndex = 0; public long FileEndIndex = 0; @@ -1340,10 +1581,12 @@ public class DosHeader // IMAGE_DOS_HEADER public class DosStub { public byte[] DosStubData; + public DosStub(long Size) { DosStubData = new byte[Size]; } + public long FileStarIndex = 0; public long FileEndIndex = 0; } @@ -1353,14 +1596,14 @@ public DosStub(long Size) /// public class PEHeader // IMAGE_FILE_HEADER { - public byte[] Header = new byte[4];// PE文件标记 - public byte[] Machine = new byte[2];// 该文件运行所要求的CPU.对于Intel平台,该值是IMAGE_FILE_MACHINE_I386 (14Ch).我们尝试了LUEVELSMEYER的pe.txt声明的14Dh和14Eh,但Windows不能正确执行.看起来,除了禁止程序执行之外,本域对我们来说用处不大. - public byte[] NumberOfSections = new byte[2];// 文件的节数目.如果我们要在文件中增加或删除一个节,就需要修改这个值. - public byte[] TimeDateStamp = new byte[4];// 文件创建日期和时间.我们不感兴趣. - public byte[] PointerToSymbolTable = new byte[4];// 用于调试. - public byte[] NumberOfSymbols = new byte[4];// 用于调试. - public byte[] SizeOfOptionalHeader = new byte[2];// 指示紧随本结构之后的 OptionalHeader 结构大小,必须为有效值. IMAGE_OPTIONAL_HEADER32 结构大小 - public byte[] Characteristics = new byte[2];// 关于文件信息的标记,比如文件是exe还是dll. + public byte[] Header = new byte[4]; // PE文件标记 + public byte[] Machine = new byte[2]; // 该文件运行所要求的CPU.对于Intel平台,该值是IMAGE_FILE_MACHINE_I386 (14Ch).我们尝试了LUEVELSMEYER的pe.txt声明的14Dh和14Eh,但Windows不能正确执行.看起来,除了禁止程序执行之外,本域对我们来说用处不大. + public byte[] NumberOfSections = new byte[2]; // 文件的节数目.如果我们要在文件中增加或删除一个节,就需要修改这个值. + public byte[] TimeDateStamp = new byte[4]; // 文件创建日期和时间.我们不感兴趣. + public byte[] PointerToSymbolTable = new byte[4]; // 用于调试. + public byte[] NumberOfSymbols = new byte[4]; // 用于调试. + public byte[] SizeOfOptionalHeader = new byte[2]; // 指示紧随本结构之后的 OptionalHeader 结构大小,必须为有效值. IMAGE_OPTIONAL_HEADER32 结构大小 + public byte[] Characteristics = new byte[2]; // 关于文件信息的标记,比如文件是exe还是dll. public long FileStarIndex = 0; public long FileEndIndex = 0; @@ -1373,41 +1616,41 @@ public class PEHeader // IMAGE_FILE_HEADER // https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_optional_header64 // IMAGE_OPTIONAL_HEADER64 public class OptionalHeader { - public byte[] Magic = new byte[2]; // Magic 010B=普通可以执行,0107=ROM映像 - public byte[] MajorLinkerVersion = new byte[1]; // 主版本号 - public byte[] MinorLinkerVersion = new byte[1]; // 副版本号 - public byte[] SizeOfCode = new byte[4]; // 代码段大小 - public byte[] SizeOfInitializedData = new byte[4]; // 已初始化数据大小 + public byte[] Magic = new byte[2]; // Magic 010B=普通可以执行,0107=ROM映像 + public byte[] MajorLinkerVersion = new byte[1]; // 主版本号 + public byte[] MinorLinkerVersion = new byte[1]; // 副版本号 + public byte[] SizeOfCode = new byte[4]; // 代码段大小 + public byte[] SizeOfInitializedData = new byte[4]; // 已初始化数据大小 public byte[] SizeOfUninitializedData = new byte[4]; // 未初始化数据大小 - public byte[] AddressOfEntryPoint = new byte[4]; // 执行将从这里开始(RVA).........入口点指向,dll填充0 - public byte[] BaseOfCode = new byte[4]; // 代码基址(RVA) - - public byte[] BaseOfData = new byte[4]; // 映象文件基址 - - public byte[] ImageBase = new byte[4]; // 数据基址(RVA) - - public byte[] SectionAlignment = new byte[4]; // 区段列队..... - public byte[] FileAlignment = new byte[4]; // 文件列队 - - public byte[] MajorOperatingSystemVersion = new byte[2]; // 操作系统主版本号 - public byte[] MinorOperatingSystemVersion = new byte[2]; // 操作系统副版本号 - public byte[] MajorImageVersion = new byte[2]; // 映象文件主版本号 - public byte[] MinorImageVersion = new byte[2]; // 映象文件副版本号 - public byte[] MajorSubsystemVersion = new byte[2]; // 子操作系统主版本号 - public byte[] MinorSubsystemVersion = new byte[2]; // 子操作系统副版本号 - public byte[] Win32VersionValue = new byte[4]; // Win32版本值 - public byte[] SizeOfImage = new byte[4]; // 映象文件大小 - public byte[] SizeOfHeards = new byte[4]; // 标志头大小 - public byte[] CheckSum = new byte[4]; // 文件效验 - public byte[] Subsystem = new byte[2]; // 子系统(映象文件)1本地 2WINDOWS-GUI 3WINDOWS-CUI 4 POSIX-CUI - public byte[] DLLCharacteristics = new byte[2]; // DLL标记 - - public byte[] SizeOfStackReserve = new byte[4]; // 保留栈的大小 - public byte[] SizeOfStackCommit = new byte[4]; // 初始时指定栈大小 - public byte[] SizeOfHeapReserve = new byte[4]; // 保留堆的大小 - public byte[] SizeOfHeapCommit = new byte[4]; // 初始时指定堆大小 - public byte[] LoaderFlags = new byte[4]; // 加载器标志 - public byte[] NumberOfRvaAndSizes = new byte[4]; // 数据目录数 + public byte[] AddressOfEntryPoint = new byte[4]; // 执行将从这里开始(RVA).........入口点指向,dll填充0 + public byte[] BaseOfCode = new byte[4]; // 代码基址(RVA) + + public byte[] BaseOfData = new byte[4]; // 映象文件基址 + + public byte[] ImageBase = new byte[4]; // 数据基址(RVA) + + public byte[] SectionAlignment = new byte[4]; // 区段列队..... + public byte[] FileAlignment = new byte[4]; // 文件列队 + + public byte[] MajorOperatingSystemVersion = new byte[2]; // 操作系统主版本号 + public byte[] MinorOperatingSystemVersion = new byte[2]; // 操作系统副版本号 + public byte[] MajorImageVersion = new byte[2]; // 映象文件主版本号 + public byte[] MinorImageVersion = new byte[2]; // 映象文件副版本号 + public byte[] MajorSubsystemVersion = new byte[2]; // 子操作系统主版本号 + public byte[] MinorSubsystemVersion = new byte[2]; // 子操作系统副版本号 + public byte[] Win32VersionValue = new byte[4]; // Win32版本值 + public byte[] SizeOfImage = new byte[4]; // 映象文件大小 + public byte[] SizeOfHeards = new byte[4]; // 标志头大小 + public byte[] CheckSum = new byte[4]; // 文件效验 + public byte[] Subsystem = new byte[2]; // 子系统(映象文件)1本地 2WINDOWS-GUI 3WINDOWS-CUI 4 POSIX-CUI + public byte[] DLLCharacteristics = new byte[2]; // DLL标记 + + public byte[] SizeOfStackReserve = new byte[4]; // 保留栈的大小 + public byte[] SizeOfStackCommit = new byte[4]; // 初始时指定栈大小 + public byte[] SizeOfHeapReserve = new byte[4]; // 保留堆的大小 + public byte[] SizeOfHeapCommit = new byte[4]; // 初始时指定堆大小 + public byte[] LoaderFlags = new byte[4]; // 加载器标志 + public byte[] NumberOfRvaAndSizes = new byte[4]; // 数据目录数 public long FileStarIndex = 0; public long FileEndIndex = 0; @@ -1417,14 +1660,14 @@ public OptionalHeader(bool is32) if (!is32) { // X64没有了,但是为了代码保留修改幅度不大,所以置0 - BaseOfData = [];// x64必须置于0 + BaseOfData = []; // x64必须置于0 // x64长度增加的 var ulonglong = 8; - ImageBase = new byte[ulonglong]; // 数据基址(RVA) + ImageBase = new byte[ulonglong]; // 数据基址(RVA) SizeOfStackReserve = new byte[ulonglong]; // 保留栈的大小 - SizeOfStackCommit = new byte[ulonglong]; // 初始时指定栈大小 - SizeOfHeapReserve = new byte[ulonglong]; // 保留堆的大小 - SizeOfHeapCommit = new byte[ulonglong]; // 初始时指定堆大小 + SizeOfStackCommit = new byte[ulonglong]; // 初始时指定栈大小 + SizeOfHeapReserve = new byte[ulonglong]; // 保留堆的大小 + SizeOfHeapCommit = new byte[ulonglong]; // 初始时指定堆大小 } } } @@ -1435,11 +1678,13 @@ public OptionalHeader(bool is32) public class OptionalDirAttrib { public ArrayList DirByte = new(); + public class DirAttrib { - public byte[] DirRva = new byte[4]; // 地址 - public byte[] DirSize = new byte[4]; // 大小 + public byte[] DirRva = new byte[4]; // 地址 + public byte[] DirSize = new byte[4]; // 大小 } + public long FileStarIndex = 0; public long FileEndIndex = 0; } @@ -1450,18 +1695,19 @@ public class DirAttrib public class SectionTable { public ArrayList Section = new(); + public class SectionData { - public byte[] SectName = new byte[8]; // 名字 - public byte[] VirtualAddress = new byte[4]; // 虚拟内存地址 - public byte[] SizeOfRawDataRVA = new byte[4]; // RVA偏移 - public byte[] SizeOfRawDataSize = new byte[4]; // RVA大小 - public byte[] PointerToRawData = new byte[4]; // 指向RAW数据 - public byte[] PointerToRelocations = new byte[4]; // 指向定位号 - public byte[] PointerToLinenumbers = new byte[4]; // 指向行数 - public byte[] NumberOfRelocations = new byte[2]; // 定位号 - public byte[] NumberOfLinenumbers = new byte[2]; // 行数号 - public byte[] Characteristics = new byte[4]; // 区段标记 + public byte[] SectName = new byte[8]; // 名字 + public byte[] VirtualAddress = new byte[4]; // 虚拟内存地址 + public byte[] SizeOfRawDataRVA = new byte[4]; // RVA偏移 + public byte[] SizeOfRawDataSize = new byte[4]; // RVA大小 + public byte[] PointerToRawData = new byte[4]; // 指向RAW数据 + public byte[] PointerToRelocations = new byte[4]; // 指向定位号 + public byte[] PointerToLinenumbers = new byte[4]; // 指向行数 + public byte[] NumberOfRelocations = new byte[2]; // 定位号 + public byte[] NumberOfLinenumbers = new byte[2]; // 行数号 + public byte[] Characteristics = new byte[4]; // 区段标记 } public long FileStarIndex = 0; @@ -1473,21 +1719,22 @@ public class SectionData /// public class ExportDirectory { - public byte[] Characteristics = new byte[4]; // 一个保留字段,目前为止值为0. - public byte[] TimeDateStamp = new byte[4]; // 产生的时间 - public byte[] MajorVersion = new byte[2]; // 主版本号 - public byte[] MinorVersion = new byte[2]; // 副版本号 - public byte[] Name = new byte[4]; // 一个RVA,指向一个dll的名称的ascii字符串 - public byte[] Base = new byte[4]; // 输出函数的起始序号.一般为1 - public byte[] NumberOfFunctions = new byte[4]; // 输出函数入口地址的数组中的元素个数 - public byte[] NumberOfNames = new byte[4]; // 输出函数名的指针的数组中的元素个数,也是输出函数名对应的序号的数组中的元素个数 - public byte[] AddressOfFunctions = new byte[4]; // 一个RVA,指向输出函数入口地址的数组 - public byte[] AddressOfNames = new byte[4]; // 一个RVA,指向输出函数名的指针的数组 + public byte[] Characteristics = new byte[4]; // 一个保留字段,目前为止值为0. + public byte[] TimeDateStamp = new byte[4]; // 产生的时间 + public byte[] MajorVersion = new byte[2]; // 主版本号 + public byte[] MinorVersion = new byte[2]; // 副版本号 + public byte[] Name = new byte[4]; // 一个RVA,指向一个dll的名称的ascii字符串 + public byte[] Base = new byte[4]; // 输出函数的起始序号.一般为1 + public byte[] NumberOfFunctions = new byte[4]; // 输出函数入口地址的数组中的元素个数 + public byte[] NumberOfNames = new byte[4]; // 输出函数名的指针的数组中的元素个数,也是输出函数名对应的序号的数组中的元素个数 + public byte[] AddressOfFunctions = new byte[4]; // 一个RVA,指向输出函数入口地址的数组 + public byte[] AddressOfNames = new byte[4]; // 一个RVA,指向输出函数名的指针的数组 public byte[] AddressOfNameOrdinals = new byte[4]; // 一个RVA,指向输出函数名对应的序号的数组 public ArrayList AddressOfFunctionsList = new(); public ArrayList AddressOfNamesList = new(); public ArrayList AddressOfNameOrdinalsList = new(); + /// /// 函数指针名称集合 /// @@ -1507,7 +1754,6 @@ public HashSet FunctionNames() } } - /// /// 输入表 /// @@ -1518,13 +1764,14 @@ public class ImportDirectory public class ImportDate { public byte[] OriginalFirstThunk = new byte[4]; // 这里实际上保存着一个RVA,这个RVA指向一个DWORD数组,这个数组可以叫做输入查询表.每个数组元素,或者叫一个表项,保存着一个指向函数名的RVA或者保存着一个函数的序号. - public byte[] TimeDateStamp = new byte[4]; // 当这个值为0的时候,表明还没有bind.不为0的话,表示已经bind过了.有关bind的内容后面介绍. + public byte[] TimeDateStamp = new byte[4]; // 当这个值为0的时候,表明还没有bind.不为0的话,表示已经bind过了.有关bind的内容后面介绍. public byte[] ForwarderChain = new byte[4]; - public byte[] Name = new byte[4]; // 一个RVA,这个RVA指向一个ascii以空字符结束的字符串,这个字符串就是本结构对应的dll文件的名字. + public byte[] Name = new byte[4]; // 一个RVA,这个RVA指向一个ascii以空字符结束的字符串,这个字符串就是本结构对应的dll文件的名字. public byte[] FirstThunk = new byte[4]; // 一个RVA,这个RVA指向一个DWORD数组,这个数组可以叫输入地址表.如果bind了的话,这个数组的每个元素,就是一个输入函数的入口地址. - public byte[]? DLLName; // DLL名称 + public byte[]? DLLName; // DLL名称 public ArrayList DLLFunctionList = new(); + public class FunctionList { public byte[] OriginalFirst = new byte[4]; @@ -1532,6 +1779,7 @@ public class FunctionList public byte[] FunctionHead = new byte[2]; } } + public long FileStarIndex = 0; public long FileEndIndex = 0; } @@ -1573,4 +1821,4 @@ public class DataEntry public long FileEndIndex = 0; } #endregion -#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 \ No newline at end of file +#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 diff --git a/tests/TestShared/CmdINI.cs b/tests/TestShared/CmdINI.cs index e4deab7..6ab4aaf 100644 --- a/tests/TestShared/CmdINI.cs +++ b/tests/TestShared/CmdINI.cs @@ -39,7 +39,6 @@ public AutoRegAssemEx() : base(AutoRegConfig.All) } } - public class CmdInit { public static AutoRegAssemEx? AutoRegAssemEx; @@ -130,7 +129,6 @@ public static void StaticInitialize() } } - /* * 自动执行:接口 */ @@ -168,8 +166,6 @@ public void Terminate() } #endif - - #endif public class Init @@ -177,7 +173,6 @@ public class Init [CommandMethod(nameof(Initialize))] public void Initialize() { - // var assembly= Assembly.GetExecutingAssembly(); // Env.Printl(assembly.GetName().Name); // var info = new AssemInfo(assembly); @@ -188,6 +183,5 @@ public void Initialize() public void Terminate() { - } } \ No newline at end of file diff --git a/tests/TestShared/TestAddEntity.cs b/tests/TestShared/TestAddEntity.cs index 123ba77..5ca7087 100644 --- a/tests/TestShared/TestAddEntity.cs +++ b/tests/TestShared/TestAddEntity.cs @@ -2,18 +2,6 @@ public partial class Test { - - - - - - - - - - - - [CommandMethod(nameof(Test_Rec))] public void Test_Rec() { @@ -29,36 +17,44 @@ public void Test_Rec() var p13 = p3 - p1; var p24 = p4 - p2; - const double pi90 = Math.PI / 2; pi90.Print(); - Tools.TestTimes(1000000, "对角线", () => { - var result = false; - if (Math.Abs(p13.Length - p24.Length) <= 1e8) - { - result = p41.IsParallelTo(p12); + Tools.TestTimes( + 1000000, + "对角线", + () => { + var result = false; + if (Math.Abs(p13.Length - p24.Length) <= 1e8) + { + result = p41.IsParallelTo(p12); + } } - }); + ); #pragma warning disable CS0219 // 变量已被赋值,但从未使用过它的值 - Tools.TestTimes(1000000, "三次点乘", () => { - bool result = Math.Abs(p12.DotProduct(p23)) < 1e8 && - Math.Abs(p23.DotProduct(p34)) < 1e8 && - Math.Abs(p34.DotProduct(p41)) < 1e8; - }); - - Tools.TestTimes(1000000, "三次垂直", () => { - bool result = p12.IsParallelTo(p23) && - p23.IsParallelTo(p34) && - p34.IsParallelTo(p41); - }); + Tools.TestTimes( + 1000000, + "三次点乘", + () => { + bool result = + Math.Abs(p12.DotProduct(p23)) < 1e8 + && Math.Abs(p23.DotProduct(p34)) < 1e8 + && Math.Abs(p34.DotProduct(p41)) < 1e8; + } + ); + + Tools.TestTimes( + 1000000, + "三次垂直", + () => { + bool result = + p12.IsParallelTo(p23) && p23.IsParallelTo(p34) && p34.IsParallelTo(p41); + } + ); #pragma warning restore CS0219 // 变量已被赋值,但从未使用过它的值 } - - - [CommandMethod(nameof(Test_EntRoration))] public void Test_EntRoration() { @@ -76,17 +72,29 @@ public void Test_TypeSpeed() { var line = new Line(); var line1 = line as Entity; - Tools.TestTimes(100000, "is 匹配:", () => { - var t = line1 is Line; - }); - Tools.TestTimes(100000, "name 匹配:", () => { - // var t = line.GetType().Name; - var tt = line1.GetType().Name == nameof(Line); - }); - Tools.TestTimes(100000, "dxfname 匹配:", () => { - // var t = line.GetType().Name; - var tt = line1.GetRXClass().DxfName == nameof(Line); - }); + Tools.TestTimes( + 100000, + "is 匹配:", + () => { + var t = line1 is Line; + } + ); + Tools.TestTimes( + 100000, + "name 匹配:", + () => { + // var t = line.GetType().Name; + var tt = line1.GetType().Name == nameof(Line); + } + ); + Tools.TestTimes( + 100000, + "dxfname 匹配:", + () => { + // var t = line.GetType().Name; + var tt = line1.GetRXClass().DxfName == nameof(Line); + } + ); } [CommandMethod(nameof(Test_sleeptrans))] diff --git a/tests/TestShared/TestBlock.cs b/tests/TestShared/TestBlock.cs index 20baa82..a8b3433 100644 --- a/tests/TestShared/TestBlock.cs +++ b/tests/TestShared/TestBlock.cs @@ -1,5 +1,4 @@ - -namespace Test; +namespace Test; public class TestBlock { @@ -47,8 +46,7 @@ public void Test_BlockDef() using DBTrans tr = new(); // var line = new Line(new Point3d(0, 0, 0), new Point3d(1, 1, 0)); tr.BlockTable.Add("test", - btr => - { + btr => { btr.Origin = new Point3d(0, 0, 0); }, () => // 图元 @@ -63,12 +61,10 @@ public void Test_BlockDef() // ObjectId objectId = tr.BlockTable.Add("a");// 新建块 // objectId.GetObject().AddEntity();// 测试添加空实体 tr.BlockTable.Add("test1", - btr => - { + btr => { btr.Origin = new Point3d(0, 0, 0); }, - () => - { + () => { var line = new Line(new Point3d(0, 0, 0), new Point3d(1, 1, 0)); var acText = DBTextEx.CreateDBText(Point3d.Origin, "123", 2.5); return new List { line, acText }; @@ -82,8 +78,7 @@ public void Test_BlockDefbehind() using DBTrans tr = new(@"C:\Users\vic\Desktop\test.dwg"); // var line = new Line(new Point3d(0, 0, 0), new Point3d(1, 1, 0)); tr.BlockTable.Add("test", - btr => - { + btr => { btr.Origin = new Point3d(0, 0, 0); }, () => // 图元 @@ -100,12 +95,10 @@ public void Test_BlockDefbehind() // ObjectId objectId = tr.BlockTable.Add("a");// 新建块 // objectId.GetObject().AddEntity();// 测试添加空实体 tr.BlockTable.Add("test1", - btr => - { + btr => { btr.Origin = new Point3d(0, 0, 0); }, - () => - { + () => { var line = new Line(new Point3d(0, 0, 0), new Point3d(1, 1, 0)); var acText = DBTextEx.CreateDBText(Point3d.Origin, "12345", 2.5); @@ -114,8 +107,6 @@ public void Test_BlockDefbehind() tr.Database.SaveDwgFile(); } - - // 修改块定义 [CommandMethod(nameof(Test_BlockDefChange))] public void Test_BlockDefChange() @@ -132,9 +123,7 @@ public void Test_BlockDefChange() // }); - - tr.BlockTable.Change("test", btr => - { + tr.BlockTable.Change("test", btr => { foreach (var id in btr) { var ent = tr.GetObject(id); @@ -146,6 +135,7 @@ public void Test_BlockDefChange() dBText.DimensionText = "234"; dBText.RecomputeDimensionBlock(true); break; + case Hatch hatch: hatch.ColorIndex = 0; break; @@ -166,7 +156,6 @@ public void Test_InsertBlockDef() var att2 = new AttributeDefinition() { Position = new Point3d(10, 12, 0), Tag = "tagTest2", Height = 1, TextString = "valueTest2" }; tr.BlockTable.Add("test1", line1, line2, att1, att2); - List ents = []; var line5 = new Line(new Point3d(0, 0, 0), new Point3d(1, 1, 0)); var line6 = new Line(new Point3d(0, 0, 0), new Point3d(-1, 1, 0)); @@ -174,7 +163,6 @@ public void Test_InsertBlockDef() ents.Add(line6); tr.BlockTable.Add("test44", ents); - var line3 = new Line(new Point3d(5, 5, 0), new Point3d(6, 6, 0)); var line4 = new Line(new Point3d(5, 5, 0), new Point3d(-6, 6, 0)); var att3 = new AttributeDefinition() { Position = new Point3d(10, 14, 0), Tag = "tagTest3", Height = 1, TextString = "valueTest3" }; @@ -209,24 +197,19 @@ public void Test_InsertBlockWithDoubleDatabase() using var trans = new DBTrans(); tr.BlockTable.Add("test456", - btr => - { + btr => { btr.Origin = new(0, 0, 0); }, - () => - { + () => { var line = new Line(new(0, 0, 0), new(1, 1, 0)); var actext = DBTextEx.CreateDBText(Point3d.Origin, "123", 2.5, database: tr.Database); return new List { line, actext }; - }); tr.CurrentSpace.InsertBlock(Point3d.Origin, "test456"); tr.Database.SaveDwgFile(); } - - [CommandMethod(nameof(Test_AddAttsDef))] public void Test_AddAttsDef() { @@ -265,11 +248,11 @@ public void Test_BlockFile() [CommandMethod(nameof(Test_BlockFiledxf))] public void Test_BlockFiledxf() { - string [] files; - var folder= new System.Windows.Forms.FolderBrowserDialog(); + string[] files; + var folder = new System.Windows.Forms.FolderBrowserDialog(); if (folder.ShowDialog() == System.Windows.Forms.DialogResult.OK) { - files = Directory.GetFiles(folder.SelectedPath,"*.dxf",SearchOption.AllDirectories); + files = Directory.GetFiles(folder.SelectedPath, "*.dxf", SearchOption.AllDirectories); using DBTrans tr = new(); foreach (var item in files) { @@ -280,20 +263,15 @@ public void Test_BlockFiledxf() tr.CurrentSpace.InsertBlock(pt.Value, id); Env.Editor.Redraw(); } - } - } - - } [CommandMethod(nameof(Test_ClipBlock))] public void Test_ClipBlock() { using DBTrans tr = new(); - tr.BlockTable.Add("test1", btr => - { + tr.BlockTable.Add("test1", btr => { btr.Origin = new Point3d(0, 0, 0); btr.AddEntity(new Line(new Point3d(0, 0, 0), new Point3d(10, 10, 0)), new Line(new Point3d(10, 10, 0), new Point3d(10, 0, 0))); @@ -309,7 +287,6 @@ public void Test_ClipBlock() brf2?.XClip(new Point3d(13, 13, 0), new Point3d(17, 17, 0)); } - [CommandMethod(nameof(Test_ClipBlock1))] public void Test_ClipBlock1() { @@ -320,11 +297,8 @@ public void Test_ClipBlock1() var brf1 = tr.GetObject(ent.ObjectId)!; var pts = new List { new Point3d(3, 3, 0), new Point3d(7, 3, 0), new Point3d(7, 7, 0), new Point3d(3, 7, 0) }; brf1.XClip(pts); - } - - // 给用户的测试程序,不知道对错 [CommandMethod(nameof(Test_Block_ej))] public void Test_Block_ej() @@ -349,8 +323,7 @@ public void Test_Block_ej() var blockdef = tr.BlockTable.GetBlockFrom(fullFileName, false); tr.Database.Clayer = tr.LayerTable["0"];// 当前图层切换为0图层 - tr.LayerTable.Change(tr.Database.Clayer, ltr => - { + tr.LayerTable.Change(tr.Database.Clayer, ltr => { ltr.Color = Color.FromColorIndex(ColorMethod.ByAci, 2); // ColorMethod.ByAci可以让我们使用AutoCAD ACI颜色索引……这里为2(表示黄色) }); @@ -375,8 +348,7 @@ public void Test_Block_ej() var btr = tr2.BlockTable[brf2.Name]; - tr2.BlockTable.Change(btr, ltr => - { + tr2.BlockTable.Change(btr, ltr => { foreach (ObjectId oid in ltr) { var ent = tr2.GetObject(oid); @@ -388,8 +360,10 @@ public void Test_Block_ej() case "$$A": mText.Contents = "hahaha"; break; + case "$$B": break; + default: break; } @@ -408,6 +382,7 @@ public void Test_Block_ej() dimension.DimensionText = "350"; dimension.RecomputeDimensionBlock(true); break; + default: break; } @@ -556,7 +531,7 @@ public void Test_QuickBlockDef1() // ed.Regen(); } - void Wblock() + private void Wblock() { var curdb = HostApplicationServices.WorkingDatabase; PromptSelectionOptions opts = new() @@ -568,6 +543,7 @@ void Wblock() var db = curdb.Wblock(ids, Point3d.Origin); db.SaveAs(@"c:\test.dwg", DwgVersion.Current); } + [CommandMethod(nameof(ChangeDynameicBlock))] public void ChangeDynameicBlock() { @@ -581,6 +557,7 @@ public void ChangeDynameicBlock() brf.ChangeBlockProperty(pro); // 这是第一个函数的用法 } + [CommandMethod(nameof(ChangeBlockProperty))] public void ChangeBlockProperty() { @@ -607,14 +584,12 @@ public void Test_Back() } using DBTrans tr = new(dwg); - tr.ModelSpace.GetEntities().ForEach(ent => - { + tr.ModelSpace.GetEntities().ForEach(ent => { ent.ForWrite(e => e.ColorIndex = 3); }); tr.Database.SaveAs(dwg, DwgVersion.Current); - tr.ModelSpace.GetEntities().ForEach(ent => - { + tr.ModelSpace.GetEntities().ForEach(ent => { ent.ForWrite(e => e.ColorIndex = 4); }); tr.Database.SaveAs(dwg, DwgVersion.Current); @@ -643,11 +618,8 @@ public void Test_ExplodeBlock() } } - - public static class Blocks { - [CommandMethod("TestExplodeToOwnerSpace3")] public static void TestExplodeToOwnerSpace3_Method() { @@ -706,6 +678,7 @@ public static ObjectIdCollection ExplodeToOwnerSpace3(ObjectId id, bool erase = } private static ObjectIdCollection idsAdded = []; + public static ObjectIdCollection ExplodeToOwnerSpace3(this BlockReference br) { idsAdded = new ObjectIdCollection(); @@ -716,6 +689,7 @@ public static ObjectIdCollection ExplodeToOwnerSpace3(this BlockReference br) return idsAdded; } + // 不能用于非等比 public static void LoopThroughInsertAndAddEntity2n3(Matrix3d mat, BlockReference br, BlockTableRecord space) { @@ -741,10 +715,8 @@ public static void LoopThroughInsertAndAddEntity2n3(Matrix3d mat, BlockReference } } } - } - public class BlockImportClass { [CommandMethod(nameof(Test_Cbll))] @@ -758,7 +730,6 @@ public void Test_Cbll() tr.Database.Insert(blkdefname, tr1.Database, false); // 插入了块定义,未插入块参照 } - [CommandMethod(nameof(Test_CombineBlocksIntoLibrary))] public void Test_CombineBlocksIntoLibrary() { @@ -860,5 +831,4 @@ public void Test_CombineBlocksIntoLibrary() pathName ); } - } \ No newline at end of file diff --git a/tests/TestShared/TestCadFilePath.cs b/tests/TestShared/TestCadFilePath.cs index c0354d5..2b36ca0 100644 --- a/tests/TestShared/TestCadFilePath.cs +++ b/tests/TestShared/TestCadFilePath.cs @@ -1,5 +1,4 @@ - -namespace Test; +namespace Test; public class TestCadFilePath { @@ -24,4 +23,4 @@ public void TestCadFilePathfun() acadkey?.SetValue(name, $@"{str}\nihao;", RegistryValueKind.String); } } -} +} \ No newline at end of file diff --git a/tests/TestShared/TestConvexHull.cs b/tests/TestShared/TestConvexHull.cs index 03692ae..10a8ece 100644 --- a/tests/TestShared/TestConvexHull.cs +++ b/tests/TestShared/TestConvexHull.cs @@ -1,6 +1,5 @@ namespace Test; - public class TestConvexHull { [CommandMethod(nameof(Test_ConvexHull))] @@ -45,7 +44,6 @@ public void Test_ConvexHull() // tr.Editor.WriteMessage(a1.ToString()); // tr.Editor.WriteMessage(a2.ToString()); - // var vec1 = new Vector2d(1, 1); // var vec2 = new Vector2d(-1, 1); diff --git a/tests/TestShared/TestCurve.cs b/tests/TestShared/TestCurve.cs index fd75698..63409dc 100644 --- a/tests/TestShared/TestCurve.cs +++ b/tests/TestShared/TestCurve.cs @@ -38,7 +38,6 @@ public void Test_Graph1() }); } - [CommandMethod(nameof(Test_Graphspeed))] public void Test_Graphspeed() { @@ -81,21 +80,17 @@ public void Test_Graphspeed() #endif } - - public partial class TestCurve { [CommandMethod(nameof(Test_CurveExtend))] public void Test_CurveExtend() { - using var tr = new DBTrans(); + using var tr = new DBTrans(); var ent = Env.Editor.GetEntity("pick curve").ObjectId.GetObject(); if (ent is Curve curve) curve.ForWrite(e => e.Extend(e.EndParam + 1)); - } - private Arc ToArc1(CircularArc2d a2d) { double startangle, endangle; @@ -121,7 +116,6 @@ private Arc ToArc1(CircularArc2d a2d) endangle); } - #if false [CommandMethod(nameof(Test_Curve_ToArc))] public void Test_Curve_ToArc() @@ -140,8 +134,6 @@ public void Test_Curve_ToArc() dbarc3.ColorIndex = 3; tr.CurrentSpace.AddEntity(dbarc3); - - Polyline pl0 = new();//创建有圆弧的多段线 pl0.AddVertexAt(0, new(-520, 200), -0.74, 0, 0); @@ -151,16 +143,15 @@ public void Test_Curve_ToArc() pl0.AddVertexAt(4, new(450, 200), -0.69, 0, 0); tr.CurrentSpace.AddEntity(pl0); - for (int FFF = 0; FFF < pl0.NumberOfVertices; FFF++) { if (pl0.GetSegmentType(FFF) == SegmentType.Arc) { var bulge = pl0.GetBulgeAt(FFF); - + //将 CircularArc2d 转为Arc 颜色为红 CircularArc2d arc2d = pl0.GetArcSegment2dAt(FFF); - + Arc arc = arc2d.ToArc(); if (bulge < 0) arc.ReverseCurve(); arc.ColorIndex = 1; @@ -180,11 +171,11 @@ public void Test_Curve_ToArc() Env.Printl($"arc的ge:顺时针:{arc2d1.IsClockWise}"); Env.Printl($"arc1的ge:起点角度:{MathEx.ConvertRadToDeg(arc2d1.StartAngle)} ,终点角度: {MathEx.ConvertRadToDeg(arc2d1.EndAngle)}"); Env.Printl($"arc1的db:起点角度:{MathEx.ConvertRadToDeg(arc1.StartAngle)} ,终点角度: {MathEx.ConvertRadToDeg(arc1.EndAngle)}"); - + //将 CircularArc3d 转为Arc 颜色为黄色 CircularArc3d arc3d = pl0.GetArcSegmentAt(FFF); Arc arc2 = arc3d.ToArc(); - + arc2.ColorIndex = 3; tr.CurrentSpace.AddEntity(arc2); Env.Printl($"arc2的ge:ReferenceVector:{MathEx.ConvertRadToDeg(arc3d.ReferenceVector.AngleOnPlane(new Plane()))}"); @@ -193,7 +184,6 @@ public void Test_Curve_ToArc() /* - arc的ge: ReferenceVector:154.872779886857 arc的ge: 顺时针:True arc的ge:起点角度:0,终点角度:146.005764482025 @@ -206,7 +196,6 @@ public void Test_Curve_ToArc() arc2的ge: 起点角度:0 ,终点角度: 146.005764482025 arc2的db: 起点角度:25.1272201131434 ,终点角度: 171.132984595169 - arc的ge: ReferenceVector:149.095360016814 arc的ge: 顺时针:False arc的ge:起点角度:0,终点角度:109.897726505109 @@ -219,7 +208,6 @@ public void Test_Curve_ToArc() arc2的ge: 起点角度:0 ,终点角度: 109.897726505109 arc2的db: 起点角度:149.095360016814 ,终点角度: 258.993086521922 - arc的ge: ReferenceVector:118.727409809308 arc的ge: 顺时针:True arc的ge:起点角度:0,终点角度:60.4383004893619 @@ -232,7 +220,6 @@ public void Test_Curve_ToArc() arc2的ge: 起点角度:0 ,终点角度: 60.4383004893619 arc2的db: 起点角度:61.2725901906918 ,终点角度: 121.710890680054 - arc的ge: ReferenceVector:277.644556524148 arc的ge: 顺时针:False arc的ge:起点角度:0,终点角度:147.479590583376 @@ -245,20 +232,13 @@ public void Test_Curve_ToArc() arc2的ge: 起点角度:0 ,终点角度: 147.479590583376 arc2的db: 起点角度:277.644556524148 ,终点角度: 65.124147107524 - - - - - */ } } - } #endif } - public partial class TestCurve { [CommandMethod(nameof(Test_BreakCurve))] diff --git a/tests/TestShared/TestDBTrans.cs b/tests/TestShared/TestDBTrans.cs index 41eb67d..333550a 100644 --- a/tests/TestShared/TestDBTrans.cs +++ b/tests/TestShared/TestDBTrans.cs @@ -33,10 +33,7 @@ private static Document Getdoc() var doc = Acaop.DocumentManager.MdiActiveDocument; return doc; } - - - - + [CommandMethod(nameof(CmdTest_DBTransActiveOpenDwg), CommandFlags.Session)] public static void CmdTest_DBTransActiveOpenDwg() { @@ -94,8 +91,6 @@ public static void CmdTest_ForEachDemo() }); } - - // 后台:不存在路径的dwg会在桌面进行临时保存 [CommandMethod(nameof(FileNotExist))] public void FileNotExist() @@ -123,7 +118,6 @@ public void FileNotExist3() tr2.Database.SaveFile(saveAsFile: "D:\\"); } - [CommandMethod(nameof(Test_SaveDwgFile))] public void Test_SaveDwgFile() { @@ -134,6 +128,7 @@ public void Test_SaveDwgFile() // tr.Database.SaveAs(filename,DwgVersion.Current); tr.Database.SaveDwgFile(); } + [CommandMethod(nameof(Test_DBTransAbort))] public void Test_DBTransAbort() { @@ -165,7 +160,6 @@ public void Test_DBTransAbort() // tr.ModelSpace.AddCircle(new Point3d(0, 0, 0), 20); // } - [CommandMethod(nameof(Test_TopTransaction))] public void Test_TopTransaction() { @@ -184,7 +178,6 @@ public void Test_TopTransaction() Env.Print(tr4.Transaction == tr5); Env.Print(tr5 == tr7); var trm = HostApplicationServices.WorkingDatabase.TransactionManager; - } [CommandMethod(nameof(Test_DBTrans_BlockCount))] @@ -194,10 +187,8 @@ public void Test_DBTrans_BlockCount() var i = tr.CurrentSpace .GetEntities() .Where(ent => ent.GetBlockName() == "自定义块"); - + var block = i.ToList()[0]; Env.Print(i.Count()); } - - } \ No newline at end of file diff --git a/tests/TestShared/TestDBobject.cs b/tests/TestShared/TestDBobject.cs index f0cb142..dbaad8a 100644 --- a/tests/TestShared/TestDBobject.cs +++ b/tests/TestShared/TestDBobject.cs @@ -1,6 +1,4 @@ - - -namespace TestShared +namespace TestShared { public static class TestDBobject { @@ -24,4 +22,4 @@ public static void TestForWrite() }); } } -} +} \ No newline at end of file diff --git a/tests/TestShared/TestDwgMark.cs b/tests/TestShared/TestDwgMark.cs index cf0d712..e8b2c85 100644 --- a/tests/TestShared/TestDwgMark.cs +++ b/tests/TestShared/TestDwgMark.cs @@ -1,11 +1,16 @@ namespace Test; + using IFoxCAD.Cad; -public class TestDwgMark { + +public class TestDwgMark +{ [CommandMethod(nameof(DwgMarktest))] - public void DwgMarktest() { + public void DwgMarktest() + { FileInfo file = new FileInfo(@"D:\TEST\1.dwg"); DwgMark.AddMark(file, 0x4D); - DwgMark.RemoveMark(file); + //DwgMark.RemoveMark(file); int A = DwgMark.GetMark(file); + Env.Print(A); } } \ No newline at end of file diff --git a/tests/TestShared/TestEditor.cs b/tests/TestShared/TestEditor.cs index 5f83345..d1621ff 100644 --- a/tests/TestShared/TestEditor.cs +++ b/tests/TestShared/TestEditor.cs @@ -23,6 +23,7 @@ public void Test_Editor() var s = ed.GetString("qustr"); Env.Editor.WriteMessage(""); } + [CommandMethod(nameof(Test_Zoom))] public void Test_Zoom() { @@ -31,6 +32,7 @@ public void Test_Zoom() if (res.Status == PromptStatus.OK) Env.Editor.ZoomObject(res.ObjectId.GetObject()!); } + [CommandMethod(nameof(Test_ZoomExtents))] public void Test_ZoomExtents() { @@ -47,25 +49,25 @@ public void Test_ZoomExtents() [CommandMethod(nameof(Test_Zoom_1))] public void Test_Zoom_1() { - Env.Editor.Zoom(new(0, 0, 0),200,200); + Env.Editor.Zoom(new(0, 0, 0), 200, 200); } + [CommandMethod(nameof(Test_Zoom_2))] public void Test_Zoom_2() { - Env.Editor.ZoomWindow(new Point3d(-100,-100,0),new(100,100,0)); + Env.Editor.ZoomWindow(new Point3d(-100, -100, 0), new(100, 100, 0)); } [CommandMethod(nameof(Test_Ssget))] public void Test_Ssget() { - var keyword = new Dictionary { { "D", ("你好", () => { Env.Print("this is c"); }) }, { "B", ("hello", () => { Env.Print("this is b"); }) } }; - var ss = Env.Editor.SSGet(/*":S", */ messages: ("get", "del" ), + var ss = Env.Editor.SSGet(/*":S", */ messages: ("get", "del"), keywords: keyword); Env.Print(ss!); } diff --git a/tests/TestShared/TestEntity/TestAddEntity.cs b/tests/TestShared/TestEntity/TestAddEntity.cs index 920e6e0..a0720b2 100644 --- a/tests/TestShared/TestEntity/TestAddEntity.cs +++ b/tests/TestShared/TestEntity/TestAddEntity.cs @@ -2,7 +2,8 @@ public class TestAddEntity { -#region 直线 + #region 直线 + [CommandMethod(nameof(Test_AddLinetoCurrentSpace))] public void Test_AddLinetoCurrentSpace() { @@ -54,28 +55,32 @@ public void Test_AddEntities() // c#12 新语法,集合表达式 tr.CurrentSpace.AddEntity([line1, line2, circle]); } -#endregion -#region 圆 + #endregion 直线 + + #region 圆 + [CommandMethod(nameof(Test_AddCircle))] public void Test_AddCircle() { - var cir = CircleEx.CreateCircle(Point3d.Origin, new(1,0,0)); // 两点创建圆 - var cir1 = CircleEx.CreateCircle(Point3d.Origin, new(1,1,0), new(2,0,0)); //三点创建圆 + var cir = CircleEx.CreateCircle(Point3d.Origin, new(1, 0, 0)); // 两点创建圆 + var cir1 = CircleEx.CreateCircle(Point3d.Origin, new(1, 1, 0), new(2, 0, 0)); //三点创建圆 var cir2 = CircleEx.CreateCircle(Point3d.Origin, 5); // 圆心半径创建圆 using DBTrans tr = new(); tr.CurrentSpace.AddEntity(cir, cir2); - + // 由于三点不一定能成功创建一个圆,因此返回值是可空的,需要判空 if (cir1 is not null) { tr.CurrentSpace.AddEntity(cir1); } } -#endregion -#region 圆弧 + #endregion 圆 + + #region 圆弧 + [CommandMethod(nameof(Test_AddArc))] public void Test_AddArc() { @@ -86,13 +91,10 @@ public void Test_AddArc() tr.CurrentSpace.AddEntity(arc1, arc2, arc3); } -#endregion + #endregion 圆弧 + #region 多段线 - - - -#region 多段线 [CommandMethod(nameof(Test_AddPolyline1))] public void Test_AddPolyline1() { @@ -121,7 +123,7 @@ public void Test_AddPolyline2() (new Point3d(0,10,0),0,0,0), (new Point3d(5,5,0),0,0,0) ]; - + using DBTrans tr = new(); var pl = pts.CreatePolyline(); tr.CurrentSpace.AddEntity(pl); @@ -143,8 +145,7 @@ public void Test_AddPolyline3() tr.CurrentSpace.AddEntity(pline); // 可以通过委托,一次性的创建多段线并设置属性 - var pline1 = pts.CreatePolyline(p => - { + var pline1 = pts.CreatePolyline(p => { p.Closed = true; p.ConstantWidth = 0.2; p.ColorIndex = 1; @@ -152,6 +153,5 @@ public void Test_AddPolyline3() tr.CurrentSpace.AddEntity(pline1); } -#endregion - -} + #endregion 多段线 +} \ No newline at end of file diff --git a/tests/TestShared/TestEnv.cs b/tests/TestShared/TestEnv.cs index d1df3b8..c8c95b9 100644 --- a/tests/TestShared/TestEnv.cs +++ b/tests/TestShared/TestEnv.cs @@ -7,6 +7,7 @@ public void Test_Enum() { Env.CmdEcho = true; } + [CommandMethod(nameof(Test_Enum1))] public void Test_Enum1() { @@ -29,6 +30,7 @@ public void Test_Dimblk() Env.Print(Env.Dimblk); Env.Print(Env.GetDimblkId(Env.DimblkType.ArchTick)); } + [CommandMethod(nameof(Test_Dimblk1))] public void Test_Dimblk1() { @@ -51,6 +53,7 @@ public void Test_Osmode() Env.OSMode ^= Env.OSModeType.Center; Env.Editor.WriteMessage(Env.OSMode.ToString()); } + [CommandMethod(nameof(Test_Osmode1))] public void Test_Osmode1() { @@ -67,7 +70,7 @@ public void Test_Cadver() 1.Print(); "1".Print(); } -#endif +#endif [CommandMethod(nameof(Test_GetVar))] public void Test_GetVar() { @@ -77,8 +80,6 @@ public void Test_GetVar() Env.SetVar("dbmod1", 1); } - - //[CommandMethod(nameof(Test_DwgVersion))] //public void TestDwgVersion() //{ @@ -88,7 +89,6 @@ public void Test_GetVar() // ((DwgVersion)a).Print(); //} - #if !zcad // 通过此功能获取全部变量,尚不清楚此处如何设置,没有通过测试 [CommandMethod(nameof(Test_GetvarAll))] @@ -103,7 +103,7 @@ public static Dictionary GetvarAll() var en = new SystemVariableEnumerator(); while (en.MoveNext()) { - Console.WriteLine(en.Current.Name + "-----" + en.Current.Value);// Value会出现异常 + Console.WriteLine(en.Current.Name + "-----" + en.Current.Value); // Value会出现异常 dict.Add(en.Current.Name, en.Current.Value); } return dict; @@ -123,13 +123,14 @@ public static void Test_GetEnv() Env.Printl("GetEnv:" + Env.GetEnv("abc")); Env.Printl("GetEnv PATH:" + Env.GetEnv("PATH")); - + Env.Printl($"getenv-acad: {Env.GetEnv("ACAD")}"); Env.Printl($"getvar-acad: {Env.GetVar("TRUSTEDPATHS")}"); Env.Printl($"getenv-TRUSTEDPATHS: {Env.GetEnv("TRUSTEDPATHS")}"); Env.Printl($"getenv-osmode: {Env.GetEnv("osmode")}"); Env.Printl($"getvar-osmode: {Env.GetVar("osmode")}"); } + [CommandMethod(nameof(Test_AppendPath))] public static void Test_AppendPath() { @@ -140,9 +141,8 @@ public static void Test_AppendPath() Env.GetEnv("ACAD").Print(); // Env.SetEnv("ACAD", @"C:\Folder1;"+Env.GetEnv("ACAD")); Env.GetEnv("ACAD").Contains(@"C:\Folder1").Print(); - } - + [CommandMethod(nameof(Test_RemovePath))] public static void Test_RemovePath() { @@ -154,10 +154,9 @@ public static void Test_RemovePath() // Env.RemoveTrustedPath(@"c:\a\x"); Env.GetEnv("ACAD").Print(); } - + public static void AppendSupportPath(string path) { - string key = HostApplicationServices.Current.UserRegistryProductRootKey; // 计算机\HKEY_CURRENT_USER\SOFTWARE\Autodesk\AutoCAD\R24.0\ACAD-4101:804 var ackey = Registry.CurrentUser.OpenSubKey($@"{key}\Profiles") ?? null; @@ -179,6 +178,4 @@ public static void AppendSupportPath(string path) ackey?.Close(); } - - } \ No newline at end of file diff --git a/tests/TestShared/TestExtents.cs b/tests/TestShared/TestExtents.cs index 96c04db..8a5f2a9 100644 --- a/tests/TestShared/TestExtents.cs +++ b/tests/TestShared/TestExtents.cs @@ -7,7 +7,7 @@ public void Test_BlockExtents() { using var tr = new DBTrans(); var ent = Env.Editor.GetEntity("pick the entity"); - if (ent.Status != PromptStatus.OK ) + if (ent.Status != PromptStatus.OK) { return; } @@ -25,11 +25,11 @@ public void Test_BlockExtents() ]; tr.CurrentSpace.AddEntity(pts.CreatePolyline(action: e => e.ColorIndex = 1)); - + if (block is BlockReference block1) { var extents = block1.GeometryExtentsBestFit(); - List pts1 = + List pts1 = [ extents.MinPoint, new Point3d(extents.MinPoint.X, extents.MaxPoint.Y, 0), @@ -40,17 +40,15 @@ public void Test_BlockExtents() var extents2 = block1.GetBoundingBoxEx(); tr.CurrentSpace.AddEntity(pts.CreatePolyline(action: e => e.ColorIndex = 3)); - + // 此处是计算块定义的包围盒,不是块参照的,所以一般情况下不需要使用。 var ext = new Extents3d(); ext.AddBlockExtents(block1.BlockTableRecord.GetObject()); tr.CurrentSpace.AddEntity(ext.CreatePolyline(action: e => e.ColorIndex = 4)); } - - } } - + [CommandMethod(nameof(Test_entextents))] public void Test_entextents() { @@ -64,8 +62,7 @@ public void Test_entextents() Env.Print($"{name}是否有包围盒-" + b); if (b) { - tr.CurrentSpace.AddEntity(e.Bounds!.Value.CreatePolyline(action: e => - { + tr.CurrentSpace.AddEntity(e.Bounds!.Value.CreatePolyline(action: e => { e.ColorIndex = 4; e.Closed = true; })); @@ -73,36 +70,29 @@ public void Test_entextents() if (ext.HasValue) { tr.CurrentSpace.AddEntity( - ext.Value.Extents3d.CreatePolyline(action: e => - { + ext.Value.Extents3d.CreatePolyline(action: e => { e.ColorIndex = 5; e.Closed = true; })); } - + if (e is Curve spline) { var ge = spline.GetGeCurve(); var box = ge.BoundBlock; - List lst = + List lst = [ box.BasePoint, box.BasePoint + box.Direction1, box.BasePoint + box.Direction2, box.BasePoint + box.Direction3, ]; - tr.CurrentSpace.AddEntity(lst.CreatePolyline(action: e => - { + tr.CurrentSpace.AddEntity(lst.CreatePolyline(action: e => { e.ColorIndex = 6; e.Closed = true; })); } - } - - - - } } } \ No newline at end of file diff --git a/tests/TestShared/TestHatchinfo.cs b/tests/TestShared/TestHatchinfo.cs index e241dfb..f14d818 100644 --- a/tests/TestShared/TestHatchinfo.cs +++ b/tests/TestShared/TestHatchinfo.cs @@ -12,5 +12,4 @@ public void TestHatchInfo() var hf = new HatchInfo(ids!, false, null, 1, 0).Mode2UserDefined(); hf.Build(tr.CurrentSpace); } -} - +} \ No newline at end of file diff --git a/tests/TestShared/TestId.cs b/tests/TestShared/TestId.cs index 57f19cf..16cc051 100644 --- a/tests/TestShared/TestId.cs +++ b/tests/TestShared/TestId.cs @@ -39,6 +39,7 @@ public void Test_MyCommand() trans.Commit(); // dbtrans.Dispose(); } + [CommandMethod(nameof(Test_TextStyle))] public void Test_TextStyle() { @@ -51,8 +52,6 @@ public void Test_TextStyle() tr.TextStyleTable.Add("arial", FontTTF.Arial, 0.8); tr.TextStyleTable.Add("romas", FontTTF.Romans, 0.8); - - tr.TextStyleTable.Add("daziti", ttr => { ttr.FileName = "ascii.shx"; ttr.BigFontFileName = "gbcbig.shx"; @@ -64,7 +63,6 @@ public void Test_TextStyleChange() { using DBTrans tr = new(); - tr.TextStyleTable.AddWithChange("宋体1", "simfang.ttf", height: 5); tr.TextStyleTable.AddWithChange("仿宋体", "宋体.ttf"); tr.TextStyleTable.AddWithChange("fsgb2312", "Romans", "gbcbig"); diff --git a/tests/TestShared/TestJig.cs b/tests/TestShared/TestJig.cs index d0076f4..64c967b 100644 --- a/tests/TestShared/TestJig.cs +++ b/tests/TestShared/TestJig.cs @@ -1,7 +1,7 @@ -namespace Test; - using System.Windows.Forms; +namespace Test; + public class Commands_Jig { // 已在数据库的图元如何进入jig @@ -17,16 +17,18 @@ public static void Test_Jig33() return; var oldSp = cir.StartPoint; JigEx? moveJig = null; - moveJig = new JigEx((mousePoint, drawEntitys) => { - moveJig!.SetOptions(oldSp);// 回调过程中也可以修改基点 - // cir.UpgradeOpen();// 已经提权了,所以这里不需要提权 - cir.Move(cir.StartPoint, mousePoint); - // cir.DowngradeOpen(); - - // 此处会Dispose图元, - // 所以此处不加入已经在数据库的图元,而是加入new Entity的. - // drawEntitys.Enqueue(cir); - }); + moveJig = new JigEx( + (mousePoint, drawEntitys) => { + moveJig!.SetOptions(oldSp); // 回调过程中也可以修改基点 + // cir.UpgradeOpen();// 已经提权了,所以这里不需要提权 + cir.Move(cir.StartPoint, mousePoint); + // cir.DowngradeOpen(); + + // 此处会Dispose图元, + // 所以此处不加入已经在数据库的图元,而是加入new Entity的. + // drawEntitys.Enqueue(cir); + } + ); moveJig.SetOptions(cir.GeometricExtents.MinPoint); // 此处详见方法注释 @@ -43,7 +45,6 @@ public static void Test_Jig33() moveJig.Dispose(); } - // 不在数据库的图元如何进入jig [CommandMethod(nameof(Test_Jig44))] public void Test_Jig44() @@ -62,33 +63,34 @@ public void Test_Jig44() * 所以需要先声明再传入指针,但是我发现null也可以. */ JigPromptPointOptions? options = null; - using var jig = new JigEx((mousePoint, drawEntitys) => { - var closestPt = pl.GetClosestPointTo(mousePoint, false); + using var jig = new JigEx( + (mousePoint, drawEntitys) => { + var closestPt = pl.GetClosestPointTo(mousePoint, false); - // 回调过程中SetOptions会覆盖配置,所以如果想增加关键字或者修改基点, - // 不要这样做: jig.SetOptions(closestPt) 而是使用底层暴露 - options!.BasePoint = closestPt; + // 回调过程中SetOptions会覆盖配置,所以如果想增加关键字或者修改基点, + // 不要这样做: jig.SetOptions(closestPt) 而是使用底层暴露 + options!.BasePoint = closestPt; - // 允许在循环中替换关键字,需要避免重复加入同一个关键字 - if (!options.Keywords.Contains("A")) - options.Keywords.Add("A"); + // 允许在循环中替换关键字,需要避免重复加入同一个关键字 + if (!options.Keywords.Contains("A")) + options.Keywords.Add("A"); - // 生成文字 - var dictString = (pl.GetDistAtPoint(closestPt) * 0.001).ToString("0.00"); - var acText = DBTextEx.CreateDBText(closestPt, dictString, 200); + // 生成文字 + var dictString = (pl.GetDistAtPoint(closestPt) * 0.001).ToString("0.00"); + var acText = DBTextEx.CreateDBText(closestPt, dictString, 200); - // 加入刷新队列 - drawEntitys.Enqueue(acText); - }); + // 加入刷新队列 + drawEntitys.Enqueue(acText); + } + ); options = jig.SetOptions(per.PickedPoint); - + // 在这里加入关键字 // 如果没有这个,那么空格只会是 PromptStatus.None 而不是 PromptStatus.Keyword // options.Keywords.Add(" ", " ", "空格结束啊"); // jig.SetSpaceIsKeyword(); - options.Keywords.Add("A","A","A"); - + options.Keywords.Add("A", "A", "A"); bool flag = true; while (flag) @@ -99,16 +101,17 @@ public void Test_Jig44() switch (pr.StringResult) { case "A": - tr.Editor?.WriteMessage($"\n 您触发了关键字{pr.StringResult}"); - flag = false; - break; + tr.Editor?.WriteMessage($"\n 您触发了关键字{pr.StringResult}"); + flag = false; + break; + case " ": - tr.Editor?.WriteMessage("\n 触发关键字空格"); - flag = false; - break; + tr.Editor?.WriteMessage("\n 触发关键字空格"); + flag = false; + break; } } - else if (pr.Status != PromptStatus.OK)// PromptStatus.None == 右键,空格,回车,都在这里结束 + else if (pr.Status != PromptStatus.OK) // PromptStatus.None == 右键,空格,回车,都在这里结束 { tr.Editor?.WriteMessage(Environment.NewLine + pr.Status.ToString()); return; @@ -144,12 +147,14 @@ public void Test_MessageFilter() // We're done - remove the message filter System.Windows.Forms.Application.RemoveMessageFilter(filter); } + // Our message filter class public class MyMessageFilter : IMessageFilter { public const int WM_KEYDOWN = 0x0100; public bool bCanceled = false; public Keys Key { get; private set; } + public bool PreFilterMessage(ref Message m) { if (m.Msg == WM_KEYDOWN) @@ -167,19 +172,15 @@ public bool PreFilterMessage(ref Message m) } } - [CommandMethod(nameof(Test_QuickText))] - static public void Test_QuickText() + public static void Test_QuickText() { var dm = Acap.DocumentManager; var doc = dm.MdiActiveDocument; var db = doc.Database; var ed = doc.Editor; - PromptStringOptions pso = new("\nEnter text string") - { - AllowSpaces = true - }; + PromptStringOptions pso = new("\nEnter text string") { AllowSpaces = true }; var pr = ed.GetString(pso); if (pr.Status != PromptStatus.OK) return; @@ -216,10 +217,12 @@ class TextPlacementJig : EntityJig readonly Transaction _tr; Point3d _position; - double _angle, _txtSize; + double _angle, + _txtSize; // Constructor - public TextPlacementJig(Transaction tr, Database db, Entity ent) : base(ent) + public TextPlacementJig(Transaction tr, Database db, Entity ent) + : base(ent) { _db = db; _tr = tr; @@ -230,20 +233,20 @@ public TextPlacementJig(Transaction tr, Database db, Entity ent) : base(ent) protected override SamplerStatus Sampler(JigPrompts jp) { // We acquire a point but with keywords - JigPromptPointOptions po = new("\nPosition of text") - { - UserInputControls = - UserInputControls.Accept3dCoordinates | - UserInputControls.NullResponseAccepted | - UserInputControls.NoNegativeResponseAccepted | - UserInputControls.GovernedByOrthoMode - }; + JigPromptPointOptions po = + new("\nPosition of text") + { + UserInputControls = + UserInputControls.Accept3dCoordinates + | UserInputControls.NullResponseAccepted + | UserInputControls.NoNegativeResponseAccepted + | UserInputControls.GovernedByOrthoMode, + }; po.SetMessageAndKeywords( - "\nSpecify position of text or " + - "[Bold/Italic/LArger/Smaller/" + - "ROtate90/LEft/Middle/RIght]: ", - "Bold Italic LArger Smaller " + - "ROtate90 LEft Middle RIght" + "\nSpecify position of text or " + + "[Bold/Italic/LArger/Smaller/" + + "ROtate90/LEft/Middle/RIght]: ", + "Bold Italic LArger Smaller " + "ROtate90 LEft Middle RIght" ); PromptPointResult ppr = jp.AcquirePoint(po); @@ -252,38 +255,42 @@ protected override SamplerStatus Sampler(JigPrompts jp) switch (ppr.StringResult) { case "Bold": - break; + break; + case "Italic": - break; - case "LArger": - { - // Multiple the text size by two - _txtSize *= 2; break; - } + + case "LArger": + { + // Multiple the text size by two + _txtSize *= 2; + break; + } case "Smaller": - { - // Divide the text size by two - _txtSize /= 2; - break; - } + { + // Divide the text size by two + _txtSize /= 2; + break; + } case "ROtate90": - { - // To rotate clockwise we subtract 90 degrees and - // then normalise the angle between 0 and 360 - _angle -= Math.PI / 2; - while (_angle < Math.PI * 2) { - _angle += Math.PI * 2; + // To rotate clockwise we subtract 90 degrees and + // then normalise the angle between 0 and 360 + _angle -= Math.PI / 2; + while (_angle < Math.PI * 2) + { + _angle += Math.PI * 2; + } + break; } - break; - } case "LEft": - break; + break; + case "RIght": - break; + break; + case "Middle": - break; + break; } return SamplerStatus.OK; } diff --git a/tests/TestShared/TestJigExTransient.cs b/tests/TestShared/TestJigExTransient.cs index 52eb3f4..9ef32b5 100644 --- a/tests/TestShared/TestJigExTransient.cs +++ b/tests/TestShared/TestJigExTransient.cs @@ -1,5 +1,4 @@ - -namespace Test; +namespace Test; public partial class Test { @@ -85,4 +84,4 @@ public static void Test_JigExTransentDim() Env.Editor.GetPoint("\n此拾取无意义,仅为了暂停查看"); tr.CurrentSpace.AddEntity(dimension); } -} +} \ No newline at end of file diff --git a/tests/TestShared/TestJson.cs b/tests/TestShared/TestJson.cs index 281e1b1..bc60097 100644 --- a/tests/TestShared/TestJson.cs +++ b/tests/TestShared/TestJson.cs @@ -9,6 +9,7 @@ public class TestJson * * */ + [CommandMethod(nameof(JavaScriptSerializer))] public void JavaScriptSerializer() { @@ -17,11 +18,8 @@ public void JavaScriptSerializer() RegisteredUsers.Add(1); RegisteredUsers.Add(2); RegisteredUsers.Add(3); - - var serializedResult = System.Text.Json.JsonSerializer.Serialize(RegisteredUsers); - var deserializedResult = System.Text.Json.JsonSerializer.Deserialize>(serializedResult); - - + var serializedResult = System.Text.Json.JsonSerializer.Serialize(RegisteredUsers); + //var deserializedResult = System.Text.Json.JsonSerializer.Deserialize>(serializedResult); } } \ No newline at end of file diff --git a/tests/TestShared/TestLayer.cs b/tests/TestShared/TestLayer.cs index 62df5e1..5e58483 100644 --- a/tests/TestShared/TestLayer.cs +++ b/tests/TestShared/TestLayer.cs @@ -18,7 +18,6 @@ public void Test_LayerAdd0() }); } - // 添加图层 [CommandMethod(nameof(Test_LayerAdd1))] public void Test_LayerAdd1() @@ -35,6 +34,7 @@ public void Test_LayerAdd2() tr.LayerTable.Add("test2", 2); // tr.LayerTable["3"] = new LayerTableRecord(); } + // 删除图层 [CommandMethod(nameof(Test_LayerDel))] public void Test_LayerDel() @@ -48,7 +48,7 @@ public void Test_LayerDel() tr.LayerTable.Remove("2"); // 测试是否能强制删除 } - + [CommandMethod(nameof(Test_PrintLayerName))] public void Test_PrintLayerName() { diff --git a/tests/TestShared/TestLisp.cs b/tests/TestShared/TestLisp.cs index 4bd7b19..1de51ea 100644 --- a/tests/TestShared/TestLisp.cs +++ b/tests/TestShared/TestLisp.cs @@ -47,17 +47,15 @@ public static object LispTest_RunLisp(ResultBuffer rb) // 命令不会被记录在命令历史记录 [CommandMethod("CmdTest_RunLisp18", CommandFlags.NoHistory)] #if (!zcad) + // 命令不会被 UNDO取消 [CommandMethod("CmdTest_RunLisp19", CommandFlags.NoUndoMarker)] // 不能在参照块中使用命令 [CommandMethod("CmdTest_RunLisp20", CommandFlags.NoBlockEditor)] - // acad09增,不会被动作录制器 捕捉到 [CommandMethod("CmdTest_RunLisp21", CommandFlags.NoActionRecording)] // acad09增,会被动作录制器捕捉 [CommandMethod("CmdTest_RunLisp22", CommandFlags.ActionMacro)] - - // 推断约束时不能使用命令 [CommandMethod("CmdTest_RunLisp23", CommandFlags.NoInferConstraint)] // 命令允许在选择图元时临时显示动态尺寸 @@ -88,35 +86,28 @@ public static void CmdTest_RunLisp() if (flag == EditorEx.RunLispFlag.AdsQueueexpr) { // 同步 - Env.Editor.RunLisp("(setq a 10)(princ)", - EditorEx.RunLispFlag.AdsQueueexpr); - Env.Editor.RunLisp("(princ a)", - EditorEx.RunLispFlag.AdsQueueexpr);// 成功输出 + Env.Editor.RunLisp("(setq a 10)(princ)", EditorEx.RunLispFlag.AdsQueueexpr); + Env.Editor.RunLisp("(princ a)", EditorEx.RunLispFlag.AdsQueueexpr); // 成功输出 } else if (flag == EditorEx.RunLispFlag.AcedEvaluateLisp) { // 使用(command "CmdTest_RunLisp1")发送,然后 !b 查看变量,acad08是有值的,高版本是null var strlisp0 = "(setq b 20)"; - var res0 = Env.Editor.RunLisp(strlisp0, - EditorEx.RunLispFlag.AcedEvaluateLisp); // 有lisp的返回值 + var res0 = Env.Editor.RunLisp(strlisp0, EditorEx.RunLispFlag.AcedEvaluateLisp); // 有lisp的返回值 var strlisp1 = "(defun f1( / )(princ \"aa\"))"; - var res1 = Env.Editor.RunLisp(strlisp1, - EditorEx.RunLispFlag.AcedEvaluateLisp); // 有lisp的返回值 + var res1 = Env.Editor.RunLisp(strlisp1, EditorEx.RunLispFlag.AcedEvaluateLisp); // 有lisp的返回值 var strlisp2 = "(defun f2( / )(command \"line\"))"; - var res2 = Env.Editor.RunLisp(strlisp2, - EditorEx.RunLispFlag.AcedEvaluateLisp); // 有lisp的返回值 + var res2 = Env.Editor.RunLisp(strlisp2, EditorEx.RunLispFlag.AcedEvaluateLisp); // 有lisp的返回值 } else if (flag == EditorEx.RunLispFlag.SendStringToExecute) { // 测试异步 // (command "CmdTest_RunLisp1")和(LispTest_RunLisp)4都是异步 var str = "(setq c 40)(princ)"; - Env.Editor.RunLisp(str, - EditorEx.RunLispFlag.SendStringToExecute); // 异步,后发送 - Env.Editor.RunLisp("(princ c)", - EditorEx.RunLispFlag.AdsQueueexpr); // 同步,先发送了,输出是null + Env.Editor.RunLisp(str, EditorEx.RunLispFlag.SendStringToExecute); // 异步,后发送 + Env.Editor.RunLisp("(princ c)", EditorEx.RunLispFlag.AdsQueueexpr); // 同步,先发送了,输出是null } } -} \ No newline at end of file +} diff --git a/tests/TestShared/TestLoop.cs b/tests/TestShared/TestLoop.cs index 438253a..13f3cf7 100644 --- a/tests/TestShared/TestLoop.cs +++ b/tests/TestShared/TestLoop.cs @@ -1,4 +1,5 @@ namespace Test; + public class TestLoop { [CommandMethod(nameof(Test_LoopList))] diff --git a/tests/TestShared/TestMirrorFile.cs b/tests/TestShared/TestMirrorFile.cs index 76ac033..d3c3b60 100644 --- a/tests/TestShared/TestMirrorFile.cs +++ b/tests/TestShared/TestMirrorFile.cs @@ -2,8 +2,8 @@ public class MirrorFile { - const string file = "D:/JX.dwg"; - const string fileSave = "D:/JX222.dwg"; + private const string file = "D:/JX.dwg"; + private const string fileSave = "D:/JX222.dwg"; /// /// 测试:后台打开图纸,镜像文字是否存在文字偏移 diff --git a/tests/TestShared/TestPoint.cs b/tests/TestShared/TestPoint.cs index b69afea..5b23bd6 100644 --- a/tests/TestShared/TestPoint.cs +++ b/tests/TestShared/TestPoint.cs @@ -1,4 +1,5 @@ namespace Test; + public class TestPoint { #if false @@ -14,9 +15,9 @@ public void Test_GetAngle() var polar = pt1.Polar(Math.PI / 2, 10); Env.Printl($"pt1 90° 距离10的点是: {polar}"); - } #endif + [CommandMethod(nameof(Test_Endtoend))] public void Test_Endtoend() { @@ -28,7 +29,6 @@ public void Test_Endtoend() new(1, 0) }; - foreach (Point2d pt in pts) { Env.Printl($"X={pt.X},Y={pt.Y}"); @@ -47,7 +47,7 @@ public void Test_Endtoend() new(1, 1,0), new(1, 0,0) }; - + foreach (Point3d pt in ptss) { Env.Printl($"X={pt.X},Y={pt.Y},Z={pt.Z}"); @@ -58,9 +58,8 @@ public void Test_Endtoend() { Env.Printl($"X={pt.X},Y={pt.Y},Z={pt.Z}"); } - } - + /// /// 红黑树排序点集 /// @@ -90,8 +89,6 @@ public void Test_PtSortedSet() } } - - [CommandMethod(nameof(Test_PtGethash))] public void Test_PtGethash() { diff --git a/tests/TestShared/TestQuadTree.cs b/tests/TestShared/TestQuadTree.cs index 1c2e2a8..7b4eb04 100644 --- a/tests/TestShared/TestQuadTree.cs +++ b/tests/TestShared/TestQuadTree.cs @@ -5,37 +5,41 @@ namespace Test; * 调用时候必须要继承它,再提供给四叉树 * 主要是用户可以扩展属性 */ + public class CadEntity : QuadEntity { public ObjectId ObjectId; + // 这里加入其他字段 public List? Link;// 碰撞链 + public System.Drawing.Color Color; public double Angle; + public CadEntity(ObjectId objectId, Rect box) : base(box) { ObjectId = objectId; } + public int CompareTo(CadEntity? other) { if (other == null) return -1; return GetHashCode() ^ other.GetHashCode(); } + public override int GetHashCode() { return (base.GetHashCode(), ObjectId.GetHashCode()).GetHashCode(); } } - - - - public partial class TestQuadTree { - QuadTree? _quadTreeRoot; + private QuadTree? _quadTreeRoot; + #region 四叉树创建并加入 + [CommandMethod(nameof(Test_QuadTree))] public void Test_QuadTree() { @@ -125,7 +129,7 @@ public void Test_QuadTree() /// /// 创建数量 /// 数据库边界 - static IEnumerable GenerateRandomCircle(int createNumber, Rect dbExt) + private static IEnumerable GenerateRandomCircle(int createNumber, Rect dbExt) { var x1 = (int)dbExt.X; var x2 = (int)(dbExt.X + dbExt.Width); @@ -253,12 +257,13 @@ void AddQuadTreeRoot(Database db, Editor ed, List ss) } #endif - #endregion + #endregion 四叉树创建并加入 /* 啊惊: 有点懒不想改了*/ #if true2 #region 节点边界显示 + // 四叉树减去节点 [CommandMethod(nameof(CmdTest_QuadTree0))] public void CmdTest_QuadTree0() @@ -327,11 +332,13 @@ public void CmdTest_CreateNodesRect() }); ed.WriteMessage($"\n四叉树深度是: {dep}"); } - #endregion + + #endregion 节点边界显示 #endif #region 四叉树查询节点 + // 选择范围改图元颜色 [CommandMethod(nameof(CmdTest_QuadTree3))] public void CmdTest_QuadTree3() @@ -349,7 +356,7 @@ public void CmdTest_QuadTree4() /// 改颜色 /// /// - void Ssget(QuadTreeSelectMode mode) + private void Ssget(QuadTreeSelectMode mode) { if (_quadTreeRoot is null) return; @@ -397,7 +404,8 @@ void Ssget(QuadTreeSelectMode mode) new Point2d(pprB.Value.X, pprB.Value.Y), true); } - #endregion + + #endregion 四叉树查询节点 } // public partial class TestQuadTree diff --git a/tests/TestShared/TestSelectfilter.cs b/tests/TestShared/TestSelectfilter.cs index cab6c92..5f1152d 100644 --- a/tests/TestShared/TestSelectfilter.cs +++ b/tests/TestShared/TestSelectfilter.cs @@ -10,7 +10,6 @@ public void Test_Filter() e => !(e.Dxf(0) == "line" & e.Dxf(8) == "0") | e.Dxf(0) != "circle" & e.Dxf(8) == "2" & e.Dxf(10) >= p); - var f2 = OpFilter.Build( e => e.Or( !e.And(e.Dxf(0) == "line", e.Dxf(8) == "0"), @@ -52,7 +51,5 @@ public void Test_Select_type() item.Print(); item.ObjectClass.DxfName.Print(); } - } - } \ No newline at end of file diff --git a/tests/TestShared/TestSingleKeyWordHook.cs b/tests/TestShared/TestSingleKeyWordHook.cs index 73fe216..039c516 100644 --- a/tests/TestShared/TestSingleKeyWordHook.cs +++ b/tests/TestShared/TestSingleKeyWordHook.cs @@ -1,4 +1,5 @@ namespace TestShared; + public static class TestSingleKeyWordHook { [CommandMethod(nameof(TestSingleKeyWordHookDemo))] @@ -29,11 +30,12 @@ public static void TestSingleKeyWordHookDemo() switch (skwh.IsResponsed ? skwh.StringResult : r1.StringResult.ToUpper()) { case "A": - line1.Rotation(line1.StartPoint, Math.PI * 0.5, Vector3d.ZAxis); - break; + line1.Rotation(line1.StartPoint, Math.PI * 0.5, Vector3d.ZAxis); + break; + case "D": - line1.Rotation(line1.StartPoint, Math.PI * 0.25, Vector3d.ZAxis); - break; + line1.Rotation(line1.StartPoint, Math.PI * 0.25, Vector3d.ZAxis); + break; } continue; } @@ -45,4 +47,4 @@ public static void TestSingleKeyWordHookDemo() return; } } -} +} \ No newline at end of file diff --git a/tests/TestShared/TestText.cs b/tests/TestShared/TestText.cs index b25dab6..e393ff6 100644 --- a/tests/TestShared/TestText.cs +++ b/tests/TestShared/TestText.cs @@ -1,14 +1,12 @@ - -namespace TestShared; +namespace TestShared; public class TestText { - [CommandMethod(nameof(TestDBText))] public void TestDBText() { using var tr = new DBTrans(); - tr.CurrentSpace.AddEntity(DBTextEx.CreateDBText(new(-1, -1, 0), "123", 2.5, action:t=> t.ColorIndex = 1)); + tr.CurrentSpace.AddEntity(DBTextEx.CreateDBText(new(-1, -1, 0), "123", 2.5, action: t => t.ColorIndex = 1)); tr.CurrentSpace.AddEntity(DBTextEx.CreateDBText(new(-1, -1, 0), "123", 2.5, action: t => { t.Justify = AttachmentPoint.BaseCenter; @@ -23,17 +21,14 @@ public void TestBackDBText() using var tr = new DBTrans(@"C:\Users\vic\Desktop\test.dwg"); tr.CurrentSpace.AddEntity(DBTextEx.CreateDBText(new(-1, -1, 0), "123", 2.5, action: t => t.ColorIndex = 1)); - tr.CurrentSpace.AddEntity(DBTextEx.CreateDBText(new(-1, -1, 0), "123", 2.5, action: t => - { - t.Justify = AttachmentPoint.BaseCenter; - t.AlignmentPoint = new(1, 1, 0); - t.ColorIndex = 2; + tr.CurrentSpace.AddEntity(DBTextEx.CreateDBText(new(-1, -1, 0), "123", 2.5, action: t => { + t.Justify = AttachmentPoint.BaseCenter; + t.AlignmentPoint = new(1, 1, 0); + t.ColorIndex = 2; })); tr.Database.SaveDwgFile(); } - - [CommandMethod(nameof(TestMText))] public void TestMText() { @@ -45,5 +40,4 @@ public void TestMText() t.ColorIndex = 2; })); } - -} +} \ No newline at end of file diff --git a/tests/TestShared/TestXdata.cs b/tests/TestShared/TestXdata.cs index a0c10af..0830f44 100644 --- a/tests/TestShared/TestXdata.cs +++ b/tests/TestShared/TestXdata.cs @@ -10,7 +10,7 @@ public class TestXdata public void Test_AddXdata() { using DBTrans tr = new(); - + tr.RegAppTable.Add("myapp1"); tr.RegAppTable.Add(Appname); // add函数会默认的在存在这个名字的时候返回这个名字的regapp的id,不存在就新建 tr.RegAppTable.Add("myapp3"); @@ -59,15 +59,16 @@ public void Test_AddXdata() { 1070, 12 } }; - tr.CurrentSpace.AddEntity(line,line1); + tr.CurrentSpace.AddEntity(line, line1); } + // 删 [CommandMethod(nameof(Test_RemoveXdata))] public void Test_RemoveXdata() { var res = Env.Editor.GetEntity("\n select the entity:"); if (res.Status != PromptStatus.OK) return; - + using DBTrans tr = new(); var ent = tr.GetObject(res.ObjectId); if (ent == null || ent.XData == null) @@ -81,6 +82,7 @@ public void Test_RemoveXdata() ent.RemoveXData(Appname); Env.Printl("\n移除appName后:" + ent.XData); } + // 查 [CommandMethod(nameof(Test_GetXdata))] public void Test_GetXdata() @@ -91,12 +93,12 @@ public void Test_GetXdata() tr.RegAppTable.GetRecords().ForEach(rec => rec.Name.Print()); tr.RegAppTable.GetRecordNames().ForEach(name => name.Print()); tr.RegAppTable.ForEach(reg => reg.Name.Print(), checkIdOk: false); - + // 查询appName里面是否含有某个 var res = Env.Editor.GetEntity("\n select the entity:"); if (res.Status != PromptStatus.OK) return; - + var ent = tr.GetObject(res.ObjectId); if (ent == null || ent.XData == null) return; @@ -113,13 +115,14 @@ public void Test_GetXdata() else Env.Printl("不含有内容:" + str); } + // 改 [CommandMethod(nameof(Test_ChangeXdata))] public void Test_ChangeXdata() { var res = Env.Editor.GetEntity("\n select the entity:"); if (res.Status != PromptStatus.OK) return; - + using DBTrans tr = new(); var data = tr.GetObject(res.ObjectId)!; data.ChangeXData(Appname, DxfCode.ExtendedDataAsciiString, "change"); @@ -128,5 +131,4 @@ public void Test_ChangeXdata() return; Env.Printl(data.XData.ToString()); } - } \ No newline at end of file diff --git a/tests/TestShared/Timer.cs b/tests/TestShared/Timer.cs index 6bd03f1..a063749 100644 --- a/tests/TestShared/Timer.cs +++ b/tests/TestShared/Timer.cs @@ -1,6 +1,4 @@ - - -namespace Test; +namespace Test; /* // 测试例子,同时验证两个计时器 @@ -28,14 +26,17 @@ public enum TimeEnum /// 秒 /// Second, + /// /// 毫秒 /// Millisecond, + /// /// 微秒 /// Microsecond, + /// /// 纳秒 /// @@ -56,8 +57,10 @@ public enum TimeEnum [DllImport("Kernel32.dll")] private static extern bool QueryPerformanceFrequency(out long lpFrequency); - private long _startTime, _stopTime; + private long _startTime, + _stopTime; private readonly long _freq; + /// /// 构造函数 /// @@ -99,22 +102,24 @@ public void Stop() /// 毫秒 /// public double Millisecond => Second * 1000.0; + /// /// 微秒 /// public double Microsecond => Second * 1000000.0; + /// /// 纳秒 /// public double Nanosecond => Second * 1000000000.0; + /// /// 计算执行委托的时间 /// /// 要执行的委托 /// 时间单位 /// 执行委托的时间 - public static double RunTime(Action action, - TimeEnum timeEnum = TimeEnum.Millisecond) + public static double RunTime(Action action, TimeEnum timeEnum = TimeEnum.Millisecond) { var nanoSecond = new Timer(); nanoSecond.Start(); @@ -127,7 +132,7 @@ public static double RunTime(Action action, TimeEnum.Millisecond => nanoSecond.Millisecond, TimeEnum.Microsecond => nanoSecond.Microsecond, TimeEnum.Nanosecond => nanoSecond.Nanosecond, - _ => 0.0 + _ => 0.0, }; //string timeNameZn = ""; //switch (timeEnum) diff --git a/tests/TestShared/Tools.cs b/tests/TestShared/Tools.cs index 4a9eefa..ab6eb76 100644 --- a/tests/TestShared/Tools.cs +++ b/tests/TestShared/Tools.cs @@ -48,7 +48,6 @@ public static void TestTimes3(int count, string message, Action action) $"{message} 代码执行 {count} 次的时间:{time} ({name})".Print(); // 总毫秒数 } - /// /// 纳秒计时器 /// @@ -56,8 +55,7 @@ public static void TestTimes3(int count, string message, Action action) public static void TestTimes(int count, string message, Action action, Timer.TimeEnum timeEnum = Timer.TimeEnum.Millisecond) { - var time = Timer.RunTime(() => - { + var time = Timer.RunTime(() => { for (var i = 0; i < count; i++) action.Invoke(); }, timeEnum); -- Gitee