乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 76|回复: 7

[编程交流] 将项目添加到区域-错误?

[复制链接]

13

主题

31

帖子

18

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 22:35:09 | 显示全部楼层 |阅读模式
:?很好的一天
 
用一些代码创建一个包含各种项目的区域:
 
代码在红色高位线上出现异常:
 
  1. [size=2]
  2. [/size][size=2][color=#0000ff][size=2][color=#0000ff]Using[/color][/size][/color][/size][size=2] acTrans [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] Autodesk.AutoCAD.DatabaseServices.Transaction = acCurDb.TransactionManager.StartTransaction()
  3. [/size][size=2][color=#0000ff][size=2][color=#0000ff]Dim[/color][/size][/color][/size][size=2] acBlkTbl [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] Autodesk.AutoCAD.DatabaseServices.BlockTable
  4. acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
  5. [/size][size=2][color=#0000ff][size=2][color=#0000ff]Dim[/color][/size][/color][/size][size=2] acBlkTblRec [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] Autodesk.AutoCAD.DatabaseServices.BlockTableRecord
  6. acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
  7. [/size][size=2][color=#0000ff][size=2][color=#0000ff]Dim[/color][/size][/color][/size][size=2] acDBObjCol [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] DBObjectCollection = [/size][size=2][color=#0000ff][size=2][color=#0000ff]New[/color][/size][/color][/size][size=2] DBObjectCollection()
  8. acDBObjCol.Add(Line1)
  9. acDBObjCol.Add(Line2)
  10. acDBObjCol.Add(Line3)
  11. acDBObjCol.Add(Line4)
  12. acDBObjCol.Add(Line5)
  13. acDBObjCol.Add(Line6)
  14. MsgBox(Line1.EndPoint.X)
  15. [/size][size=2][color=#0000ff][size=2][color=#0000ff]Dim[/color][/size][/color][/size][size=2] myRegionCol [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] DBObjectCollection = [/size][size=2][color=#0000ff][size=2][color=#0000ff]New[/color][/size][/color][/size][size=2] DBObjectCollection()
  16. [color=red]myRegionCol = Autodesk.AutoCAD.DatabaseServices.Region.CreateFromCurves(acDBObjCol)[/color]
  17. [/size][size=2][color=#0000ff][size=2][color=#0000ff]Dim[/color][/size][/color][/size][size=2] acRegion [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] Autodesk.AutoCAD.DatabaseServices.Region = myRegionCol(0)
  18. acBlkTblRec.AppendEntity(acRegion)
  19. acTrans.AddNewlyCreatedDBObject(acRegion, [/size][size=2][color=#0000ff][size=2][color=#0000ff]True[/color][/size][/color][/size][size=2])
  20. [/size][size=2][color=#0000ff][size=2][color=#0000ff]End[/color][/size][/color][/size][size=2] [/size][size=2][color=#0000ff][size=2][color=#0000ff]Using
  21. [/color][/size][/color][/size][size=2][/size][size=2][color=#0000ff][size=2][color=#0000ff]Catch[/color][/size][/color][/size][size=2] ex [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] Exception
  22. MsgBox([/size][size=2][color=#a31515][size=2][color=#a31515]"Error"[/color][/size][/color][/size][size=2])
  23. [/size][size=2][color=#0000ff][size=2][color=#0000ff]End[/color][/size][/color][/size][size=2] [/size][size=2][color=#0000ff][size=2][color=#0000ff]Try
  24. [/color][/size][/color][/size]

 
线条是用这个公共功能处理的:“Friend Function DrawLine”
返回该行。
生成的行:“
Line1=DrawLine(PntSt,ModDrawLine.DTR(AngLine),LineLng)”
  1. [size=2]
  2. [/size][size=2][color=#0000ff][size=2][color=#0000ff]Friend[/color][/size][/color][/size][size=2] [/size][size=2][color=#0000ff][size=2][color=#0000ff]Function[/color][/size][/color][/size][size=2] DrawLine([/size][size=2][color=#0000ff][size=2][color=#0000ff]ByVal[/color][/size][/color][/size][size=2] startPoint [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] Point3d, [/size][size=2][color=#0000ff][size=2][color=#0000ff]ByVal[/color][/size][/color][/size][size=2] angle [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] [/size][size=2][color=#0000ff][size=2][color=#0000ff]Double[/color][/size][/color][/size][size=2], [/size][size=2][color=#0000ff][size=2][color=#0000ff]ByVal[/color][/size][/color][/size][size=2] length [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] [/size][size=2][color=#0000ff][size=2][color=#0000ff]Double[/color][/size][/color][/size][size=2]) [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] Line
  3. [/size][size=2][color=#0000ff][size=2][color=#0000ff]Dim[/color][/size][/color][/size][size=2] acDoc [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] Document = Application.DocumentManager.MdiActiveDocument
  4. [/size][size=2][color=#0000ff][size=2][color=#0000ff]Dim[/color][/size][/color][/size][size=2] acCurDb [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] Database = acDoc.Database
  5. acDoc.LockDocument()
  6. [/size][size=2][color=#0000ff][size=2][color=#0000ff]Dim[/color][/size][/color][/size][size=2] id [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] ObjectId
  7. [/size][size=2][color=#0000ff][size=2][color=#0000ff]Dim[/color][/size][/color][/size][size=2] line [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] Line = [/size][size=2][color=#0000ff][size=2][color=#0000ff]Nothing
  8. [/color][/size][/color][/size][size=2][/size][size=2][color=#0000ff][size=2][color=#0000ff]Using[/color][/size][/color][/size][size=2] db [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] Database = HostApplicationServices.WorkingDatabase()
  9. [/size][size=2][color=#0000ff][size=2][color=#0000ff]Dim[/color][/size][/color][/size][size=2] endpoint [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] Point3d = ModDrawLine.PolarPoint(startPoint, angle, length)
  10. startPoint = ModDrawLine.TransformByUCS(startPoint, db)
  11. endpoint = ModDrawLine.TransformByUCS(endpoint, db)
  12. [/size][size=2][color=#0000ff][size=2][color=#0000ff]Using[/color][/size][/color][/size][size=2] tr [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] Transaction = db.TransactionManager.StartTransaction
  13. [/size][size=2][color=#0000ff][size=2][color=#0000ff]Try
  14. [/color][/size][/color][/size][size=2][/size][size=2][color=#0000ff][size=2][color=#0000ff]Dim[/color][/size][/color][/size][size=2] btr [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] BlockTableRecord = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite, [/size][size=2][color=#0000ff][size=2][color=#0000ff]False[/color][/size][/color][/size][size=2])
  15. line = [/size][size=2][color=#0000ff][size=2][color=#0000ff]New[/color][/size][/color][/size][size=2] Line(startPoint, endpoint)
  16. id = btr.AppendEntity(line)
  17. db.TransactionManager.AddNewlyCreatedDBObject(line, [/size][size=2][color=#0000ff][size=2][color=#0000ff]True[/color][/size][/color][/size][size=2])
  18. tr.Commit()
  19. [/size][size=2][color=#0000ff][size=2][color=#0000ff]Catch[/color][/size][/color][/size][size=2] ex [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] Exception
  20. tr.Abort()
  21. [/size][size=2][color=#0000ff][size=2][color=#0000ff]End[/color][/size][/color][/size][size=2] [/size][size=2][color=#0000ff][size=2][color=#0000ff]Try
  22. [/color][/size][/color][/size][size=2][/size][size=2][color=#0000ff][size=2][color=#0000ff]End[/color][/size][/color][/size][size=2] [/size][size=2][color=#0000ff][size=2][color=#0000ff]Using
  23. [/color][/size][/color][/size][size=2][/size][size=2][color=#0000ff][size=2][color=#0000ff]End[/color][/size][/color][/size][size=2] [/size][size=2][color=#0000ff][size=2][color=#0000ff]Using
  24. [/color][/size][/color][/size][size=2][/size][size=2][color=#0000ff][size=2][color=#0000ff]Return[/color][/size][/color][/size][size=2] line
  25. [/size][size=2][color=#0000ff][size=2][color=#0000ff]End[/color][/size][/color][/size][size=2] [/size][size=2][color=#0000ff][size=2][color=#0000ff]Function
  26. [/color][/size][/color][/size]

 
欢迎任何帮助
当做
穴居人密码
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 22:44:39 | 显示全部楼层
我很确定你的行没有创建封闭区域,因为这是工作代码
为了确保更好地使用闭合多段线或绘制直线链测长度
取决于以前的线点,例如:
  1.   ' by Tony Tanzillo
  2.        Friend Function PolarPoint(basepoint As Point3d, angle As Double, distance As Double) As Point3d
  3.            Return New Point3d(basepoint.X + (distance * Math.Cos(angle)), basepoint.Y + (distance * Math.Sin(angle)), basepoint.Z)
  4.        End Function
  5.        <CommandMethod("demoreg")> _
  6.        Public Sub RegionDemo()
  7.            Dim acCurDb As Database = HostApplicationServices.WorkingDatabase
  8.            Dim ed As Editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor
  9.            Try
  10.                Using acTrans As Autodesk.AutoCAD.DatabaseServices.Transaction = acCurDb.TransactionManager.StartTransaction()
  11.                    Dim acBlkTbl As Autodesk.AutoCAD.DatabaseServices.BlockTable
  12.                    acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
  13.                    Dim acBlkTblRec As Autodesk.AutoCAD.DatabaseServices.BlockTableRecord
  14.                    acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
  15.                    Dim acDBObjCol As DBObjectCollection = New DBObjectCollection()
  16.                    Dim Line1 As Line = DrawLine(New Point3d(0, 0, 0), 0.0, 100)
  17.                    Dim Line2 As Line = DrawLine(Line1.EndPoint, Math.PI / 2 - Math.PI / 6, 100)
  18.                    Dim Line3 As Line = DrawLine(Line2.EndPoint, Math.PI / 2 + Math.PI / 6, 100)
  19.                    Dim Line4 As Line = DrawLine(Line3.EndPoint, Math.PI, 100)
  20.                    Dim Line5 As Line = DrawLine(Line4.EndPoint, Math.PI * 1.5 - Math.PI / 6, 100)
  21.                    Dim Line6 As Line = DrawLine(Line5.EndPoint, Math.PI * 1.5 + Math.PI / 6, 100)
  22.                    acDBObjCol.Add(Line1)
  23.                    acDBObjCol.Add(Line2)
  24.                    acDBObjCol.Add(Line3)
  25.                    acDBObjCol.Add(Line4)
  26.                    acDBObjCol.Add(Line5)
  27.                    acDBObjCol.Add(Line6)
  28.                    ''MsgBox(Line1.EndPoint.X)
  29.                    Dim myRegionCol As DBObjectCollection = New DBObjectCollection()
  30.                    myRegionCol = Autodesk.AutoCAD.DatabaseServices.Region.CreateFromCurves(acDBObjCol)
  31.                    Dim acRegion As Autodesk.AutoCAD.DatabaseServices.Region = DirectCast(myRegionCol(0), Autodesk.AutoCAD.DatabaseServices.Region)
  32.                    acBlkTblRec.AppendEntity(acRegion)
  33.                    acTrans.AddNewlyCreatedDBObject(acRegion, True)
  34.                    ' ---> here you might be want to erase and dispose lines after
  35.                    acTrans.Commit()
  36.                End Using
  37.            Catch ex As System.Exception
  38.                MsgBox("Error" + vbLf + ex.ToString)
  39.            End Try
  40.        End Sub

 
~'J'~
回复

使用道具 举报

13

主题

31

帖子

18

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 22:53:31 | 显示全部楼层
你好
 
我在开头创建的函数将线条绘制到当前UCS
然后我决定在代码中挤出这些项
如果我识别出绘制的点都是正确的,如果我在AutoCAD中手动选择要创建一个区域的项目,所有这些都有效。但代码中的相同项给出了创建区域的错误。
 
我知道的错误:1)我用来创建行的方法不完全正确,无法在代码中创建区域?2) 当我在代码中使用区域时,我可能不在正确的ucs上?
 
您的代码例程更加简单
将完成您的示例
 
感谢您的帮助
顺致敬意,
穴居人
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 23:07:38 | 显示全部楼层
顺便说一句,山洞不错
回复

使用道具 举报

13

主题

31

帖子

18

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 23:09:49 | 显示全部楼层
你好
 
在WCS中生成项目时,所有项目都是文件
如果UCS发生变化,则错误如下:
 
233515i922wj06zrfpz4k8.png
 
 
我学到的是,我没有将这些点转换为新用户UCS。
 
正在进行中
有什么好主意吗
 
原谅-第一次写代码来画东西-所以必须发现正确的方法
 
表示感谢
穴居人
密码文件
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 23:19:35 | 显示全部楼层
您的代码经过了适度的重构。我认为原作的一些转换是无序的。
重组。文件
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 23:31:42 | 显示全部楼层
哎呀。我忘了变换初始点。这将更好地匹配当前UCS原点。
 
 
  1. <CommandMethod("demoreg")> PublicSub RegionDemo()
  2.        Dim acCurDb As Database= HostApplicationServices.WorkingDatabase
  3.        Dim ed As Editor =Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor
  4.        Try
  5.            Using acTrans As Autodesk.AutoCAD.DatabaseServices.Transaction =
  6. acCurDb.TransactionManager.StartTransaction()
  7.             Dim acBlkTbl As Autodesk.AutoCAD.DatabaseServices.BlockTable
  8.             acBlkTbl =acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
  9.             Dim acBlkTblRec As Autodesk.AutoCAD.DatabaseServices.BlockTableRecord
  10.             acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace),OpenMode.ForWrite)
  11.             Dim acDBObjCol As DBObjectCollection= New DBObjectCollection()
  12.             Dim MatToUcs As Matrix3d= GetUcsMatrix(acCurDb)
  13.             Dim Initial As Point3d= New Point3d().TransformBy(MatToUcs)
  14.             Dim Line1 As Line= DrawLine(Initial, 0.0, 100, MatToUcs)
  15.             Dim Line2 As Line= DrawLine(Line1.EndPoint, Math.PI / 2 - Math.PI / 6, 100, MatToUcs)
  16.             Dim Line3 As Line= DrawLine(Line2.EndPoint, Math.PI / 2 + Math.PI / 6, 100, MatToUcs)
  17.             Dim Line4 As Line= DrawLine(Line3.EndPoint, Math.PI, 100,MatToUcs)
  18.             Dim Line5 As Line= DrawLine(Line4.EndPoint, Math.PI * 1.5 - Math.PI / 6, 100, MatToUcs)
  19.             Dim Line6 As Line= DrawLine(Line5.EndPoint, Math.PI * 1.5 + Math.PI / 6, 100, MatToUcs)
  20.             acDBObjCol.Add(Line1)
  21.             acDBObjCol.Add(Line2)
  22.             acDBObjCol.Add(Line3)
  23.             acDBObjCol.Add(Line4)
  24.             acDBObjCol.Add(Line5)
  25.             acDBObjCol.Add(Line6)
  26.             Dim myRegionCol As DBObjectCollection= New DBObjectCollection()
  27.             myRegionCol = Autodesk.AutoCAD.DatabaseServices.Region.CreateFromCurves(acDBObjCol)
  28.             Dim acRegion As Autodesk.AutoCAD.DatabaseServices.Region = DirectCast(myRegionCol(0),Autodesk.AutoCAD.DatabaseServices.Region)
  29.               acBlkTblRec.AppendEntity(acRegion)
  30.               acTrans.AddNewlyCreatedDBObject(acRegion, True)
  31.                '---> here you might be want to erase and dispose lines after
  32.               acTrans.Commit()
  33.            End Using
  34. Catch ex As System.Exception
  35.            MsgBox("Error"+ vbLf + ex.ToString)
  36.        End Try
  37.    End Sub
回复

使用道具 举报

13

主题

31

帖子

18

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 23:38:15 | 显示全部楼层
你好
 
 
非常感谢你的帮助
我的代码按预期运行。
 
“尺寸线1作为线=绘制线(首字母,0.0100,MatToUcs)”
您的方法与上面的高级方法一样优秀-使代码保持简单
 
现在,我们面临着下一个挑战
 
干杯
谢谢
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-4 05:38 , Processed in 0.754723 second(s), 70 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表