PellaCAD 发表于 2022-7-6 12:48:16

在绘图中收集视口

是否可以构建在图形的每个布局中使用的视口集合(只是普通的旧视口)?
 
有人知道怎么做吗?
 
这是火箭科学吗???(很抱歉听起来很沮丧,但我已经连续工作了几天了……)

Lee Mac 发表于 2022-7-6 12:51:57

如果你在这里没有得到一个好的答案,可以试试theSwamp。org,他们有一个完整的论坛致力于。净额
 
请参见此处:
 
http://www.theswamp.org/index.php?board=27.0

SEANT 发表于 2022-7-6 12:56:55

下面是一个相当基本的示例例程,用于收集与特定布局相关的视口。
 
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.ApplicationServices

Public Class SampleCommands


   <CommandMethod("LVP")> _
   Public Sub LayoutVPs()
       Dim doc As Document = Application.DocumentManager.MdiActiveDocument
       Dim db As Database = doc.Database
       Dim ed As Editor = doc.Editor
       Dim layId As ObjectId
       Dim lo As Layout
       Dim loName As String

       Using trans As Transaction = db.TransactionManager.StartTransaction()
         Dim laydic As DBDictionary = DirectCast(trans.GetObject(db.LayoutDictionaryId, OpenMode.ForRead, False), DBDictionary)
         For Each dentry As DictionaryEntry In laydic

               layId = DirectCast(dentry.Value, ObjectId)
               lo = DirectCast(trans.GetObject(layId, OpenMode.ForRead), Layout)
               loName = lo.LayoutName
               If loName <> "Model" Then
                   ed.WriteMessage(vbLf & "Layout " & loName & " has " & CollectVieports(lo, doc).Count & " viewports.")
               End If
         Next
       End Using

   End Sub

   Function CollectVieports(ByRef lo As Layout, ByRef doc As Document) As ObjectIdCollection

       Dim db As Database = doc.Database
       Dim Btr As BlockTableRecord
       Dim vp As Viewport
       Dim oidcol As ObjectIdCollection = New ObjectIdCollection()
       Dim notpvp As Boolean 'don't include the general layout vp
       Using trans As Transaction = db.TransactionManager.StartTransaction()
         Btr = DirectCast(trans.GetObject(lo.BlockTableRecordId, OpenMode.ForRead), BlockTableRecord)
         For Each oid As ObjectId In Btr
               vp = TryCast(trans.GetObject(oid, OpenMode.ForRead), Viewport)
               If Not vp Is Nothing Then
                   If notpvp Then oidcol.Add(oid)
                   notpvp = True
               End If

         Next
       End Using
       Return oidcol
   End Function

End Class

Lee Mac 发表于 2022-7-6 12:59:34

我简直不敢相信肖恩会在这些例程中加入多少代码——我想我已经被LISP宠坏了。

SEANT 发表于 2022-7-6 13:02:34

我怀疑这对于任何其他编程语言都是正确的。
 
由于对可读性的心态,VB往往比其他语言更冗长(甚至可能设计为非程序员可以理解)。我认为这样做的好处之一是减少了对代码内注释的需要。
 
 
当然,上面帖子中打印的所有内容都不需要显式键入。VS IDE有很多功能可以为您(或我,视情况而定)打字。
 
此外,该示例还有一些附加步骤,这些步骤不是发布到命令行所需的,但可能对更实际的任务有用。

PellaCAD 发表于 2022-7-6 13:04:27

首先,感谢您的帮助!(我真的一直在这个问题上苦苦挣扎……)
 
为什么在尝试执行此代码时会收到“FileNotFoundException was unhandled”警报?
 
我把“Public Sub LayoutVPs”和“Function collectieports”分别作为公共子和函数放入我的表单中。。。
 
我也在表格顶部添加了“Imports”语句。。。
 
这个例程在寻找什么文件,它找不到???
 
困惑。。。

SEANT 发表于 2022-7-6 13:07:33

例程在这行代码中不查找除活动文档之外的任何文件:
 
Dim doc As Document=应用程序。DocumentManager。MdiActiveDocument
 
 
然而,作为为AutoCAD命令行设计的例程,它可能缺少与用户窗体一起使用所需的一些参数。
 
当您单步执行合成代码时,哪一行会产生错误?

PellaCAD 发表于 2022-7-6 13:13:07

嗨,肖特,
 
我有一个按钮点击布局视频。。。该程序在LayoutVPs呼叫时立即启动。
 
使用此视口收集过程的建议方法是什么?
 
好啊除了“Dim db As Database=objAcad.ActiveDocument.Database”行之外,我刚刚注释掉了所有内容。。。仍在爆炸。
我认为它不喜欢“As数据库”。。。我怎样才能绝对地定义这个定义?
 
皮特

SEANT 发表于 2022-7-6 13:16:34

如前所述,该例程旨在从命令行运行。如果你愿意的话,我已经附上了项目文件来测试。从VS进行调试,从“…CountlayoutsVPs\CountlayoutsVPs\bin\debug”进行网络加载,或从“…CountlayoutsVPs\CountlayoutsVPs\bin\Release”运行编译版本。无论使用哪种方法,LVP命令都应在AutoCAD中启动例程。
 
除非我看到表单的点击事件是如何设置的,否则我无法确定它为什么会爆炸。
CountlayoutsVPs。拉链

PellaCAD 发表于 2022-7-6 13:18:38

如果我能和你分享一些我的系统信息,可能会很有用。。。(很抱歉)。。。
 
Visual Studio 2005专业版。
AutoCAD 2008
 
我正在编译到exe并在AutoCAD外部运行,程序从外部启动,如果发现AutoCAD没有运行,则启动AutoCAD。
 
我用来启动布局收集器的代码是:
********************************************************************************
PrivateSub bnOK4\u Click(ByVal sender As System.Object,ByVal e As System.EventArgs)处理bnOK4。点击
 
布局VPS()
 
EndSub
********************************************************************************
我不得不更改这些行:
 
Dim doc As Document=应用程序。DocumentManager。MdiActiveDocument
Dim db As Database=doc。数据库
 

 
Dim doc As AcadDocument(将文档作为一份文档)
Dim db As AcadDatabase=objAcad。ActiveDocument。数据库
 
 
我正试图为以下方面找到一个等价物:
 
Dim ed As Editor=doc。编辑
 
我正在加载CountLayoutsVP2。您之前发送的zip文件。。。我几分钟后回来报告。
 
___
 
答对 了!有一次我从ACAD 2009改为ACAD 2008,做了NETLOAD的事情。。。她开始工作。
 
您的代码是我在15个多月的工作中发现的最接近解决方案的代码。。。
 
是时候把你的NETLOAD代码转换成我的EXE代码了。如果你有几分钟的时间,我当然需要你的帮助。。。
 
皮特(一个特大号的谢谢!)
页: [1] 2
查看完整版本: 在绘图中收集视口