AutoCAD .NET矩形阵列自定义命令代码报错,寻求修正帮助
问题分析与代码修正
核心报错原因
代码中调用的PolarPoints方法并非AutoCAD .NET原生API方法,官方文档默认用户已自行实现该方法,这是导致编译报错的主要原因。此外需确保项目已正确引用AutoCAD相关程序集并导入必要命名空间。
完整修正代码
补充缺失的PolarPoints方法,同时完善命名空间引用与代码结构:
Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.Geometry Imports Autodesk.AutoCAD.Runtime Public Class RectangularArrayCommands <CommandMethod("RectangularArrayObject")> Public Shared Sub RectangularArrayObject() '' 获取当前文档与数据库 Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument Dim acCurDb As Database = acDoc.Database '' 启动事务 Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() '' 以读模式打开块表 Dim acBlkTbl As BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) '' 以写模式打开模型空间块表记录 Dim acBlkTblRec As BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite) '' 创建一个圆心在(2,2)、半径0.5的圆 Dim acCirc As Circle = New Circle() acCirc.SetDatabaseDefaults() acCirc.Center = New Point3d(2, 2, 0) acCirc.Radius = 0.5 '' 将新对象添加到块表记录与事务中 acBlkTblRec.AppendEntity(acCirc) acTrans.AddNewlyCreatedDBObject(acCirc, True) '' 创建5行5列的矩形阵列 Dim nRows As Integer = 5 Dim nColumns As Integer = 5 '' 设置行、列偏移量及阵列基准角度 Dim dRowOffset As Double = 1 Dim dColumnOffset As Double = 1 Dim dArrayAng As Double = 0 '' 获取当前UCS的X轴角度 Dim curUCSMatrix As Matrix3d = acDoc.Editor.CurrentUserCoordinateSystem Dim curUCS As CoordinateSystem3d = curUCSMatrix.CoordinateSystem3d Dim acVec2dAng As Vector2d = New Vector2d(curUCS.Xaxis.X, curUCS.Xaxis.Y) '' 若UCS旋转,同步调整阵列角度 dArrayAng = dArrayAng + acVec2dAng.Angle '' 使用对象范围的左上角作为阵列基点 Dim acExts As Extents3d = acCirc.Bounds.GetValueOrDefault() Dim acPt2dArrayBase As Point2d = New Point2d(acExts.MinPoint.X, acExts.MaxPoint.Y) '' 跟踪列方向创建的对象 Dim acDBObjCollCols As DBObjectCollection = New DBObjectCollection() acDBObjCollCols.Add(acCirc) '' 创建第一列的剩余对象 Dim nColumnsCount As Integer = 1 While (nColumns > nColumnsCount) Dim acEntClone As Entity = acCirc.Clone() acDBObjCollCols.Add(acEntClone) '' 计算复制对象的新位置(移动) Dim acPt2dTo As Point2d = PolarPoints(acPt2dArrayBase, dArrayAng, dColumnOffset * nColumnsCount) Dim acVec2d As Vector2d = acPt2dArrayBase.GetVectorTo(acPt2dTo) Dim acVec3d As Vector3d = New Vector3d(acVec2d.X, acVec2d.Y, 0) acEntClone.TransformBy(Matrix3d.Displacement(acVec3d)) acBlkTblRec.AppendEntity(acEntClone) acTrans.AddNewlyCreatedDBObject(acEntClone, True) nColumnsCount = nColumnsCount + 1 End While '' 设置90度的弧度值 Dim dAng As Double = Math.PI / 2 '' 跟踪行、列方向创建的所有对象 Dim acDBObjCollLvls As DBObjectCollection = New DBObjectCollection() For Each acObj As DBObject In acDBObjCollCols acDBObjCollLvls.Add(acObj) Next '' 创建每行的剩余对象 For Each acEnt As Entity In acDBObjCollCols Dim nRowsCount As Integer = 1 While (nRows > nRowsCount) Dim acEntClone As Entity = acEnt.Clone() acDBObjCollLvls.Add(acEntClone) '' 计算复制对象的新位置(移动) Dim acPt2dTo As Point2d = PolarPoints(acPt2dArrayBase, dArrayAng + dAng, dRowOffset * nRowsCount) Dim acVec2d As Vector2d = acPt2dArrayBase.GetVectorTo(acPt2dTo) Dim acVec3d As Vector3d = New Vector3d(acVec2d.X, acVec2d.Y, 0) acEntClone.TransformBy(Matrix3d.Displacement(acVec3d)) acBlkTblRec.AppendEntity(acEntClone) acTrans.AddNewlyCreatedDBObject(acEntClone, True) nRowsCount = nRowsCount + 1 End While Next '' 保存新对象到数据库 acTrans.Commit() End Using End Sub '' 补充缺失的极坐标点计算方法 Private Shared Function PolarPoints(basePt As Point2d, angle As Double, distance As Double) As Point2d Return New Point2d(basePt.X + Math.Cos(angle) * distance, basePt.Y + Math.Sin(angle) * distance) End Function End Class
额外注意事项
- 确保项目已引用AutoCAD核心程序集:
acdbmgd.dll、acmgd.dll - 代码需放在类中,不能直接作为顶级方法存在
- 修正了原代码中的拼写错误:
Caclucate改为Calculate
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

