乐筑天下

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

[编程交流] 在绘图中收集视口

[复制链接]

2

主题

14

帖子

12

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 12:48:16 | 显示全部楼层 |阅读模式
是否可以构建在图形的每个布局中使用的视口集合(只是普通的旧视口)?
 
有人知道怎么做吗?
 
这是火箭科学吗???(很抱歉听起来很沮丧,但我已经连续工作了几天了……)
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:51:57 | 显示全部楼层
如果你在这里没有得到一个好的答案,可以试试theSwamp。org,他们有一个完整的论坛致力于。净额
 
请参见此处:
 
http://www.theswamp.org/index.php?board=27.0
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 12:56:55 | 显示全部楼层
下面是一个相当基本的示例例程,用于收集与特定布局相关的视口。
 
  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.DatabaseServices
  3. Imports Autodesk.AutoCAD.EditorInput
  4. Imports Autodesk.AutoCAD.ApplicationServices
  5. Public Class SampleCommands
  6.    <CommandMethod("LVP")> _
  7.    Public Sub LayoutVPs()
  8.        Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  9.        Dim db As Database = doc.Database
  10.        Dim ed As Editor = doc.Editor
  11.        Dim layId As ObjectId
  12.        Dim lo As Layout
  13.        Dim loName As String
  14.        Using trans As Transaction = db.TransactionManager.StartTransaction()
  15.            Dim laydic As DBDictionary = DirectCast(trans.GetObject(db.LayoutDictionaryId, OpenMode.ForRead, False), DBDictionary)
  16.            For Each dentry As DictionaryEntry In laydic
  17.                layId = DirectCast(dentry.Value, ObjectId)
  18.                lo = DirectCast(trans.GetObject(layId, OpenMode.ForRead), Layout)
  19.                loName = lo.LayoutName
  20.                If loName <> "Model" Then
  21.                    ed.WriteMessage(vbLf & "Layout " & loName & " has " & CollectVieports(lo, doc).Count & " viewports.")
  22.                End If
  23.            Next
  24.        End Using
  25.    End Sub
  26.    Function CollectVieports(ByRef lo As Layout, ByRef doc As Document) As ObjectIdCollection
  27.        Dim db As Database = doc.Database
  28.        Dim Btr As BlockTableRecord
  29.        Dim vp As Viewport
  30.        Dim oidcol As ObjectIdCollection = New ObjectIdCollection()
  31.        Dim notpvp As Boolean 'don't include the general layout vp
  32.        Using trans As Transaction = db.TransactionManager.StartTransaction()
  33.            Btr = DirectCast(trans.GetObject(lo.BlockTableRecordId, OpenMode.ForRead), BlockTableRecord)
  34.            For Each oid As ObjectId In Btr
  35.                vp = TryCast(trans.GetObject(oid, OpenMode.ForRead), Viewport)
  36.                If Not vp Is Nothing Then
  37.                    If notpvp Then oidcol.Add(oid)
  38.                    notpvp = True
  39.                End If
  40.            Next
  41.        End Using
  42.        Return oidcol
  43.    End Function
  44. End Class
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:59:34 | 显示全部楼层
我简直不敢相信肖恩会在这些例程中加入多少代码——我想我已经被LISP宠坏了。
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

2

主题

14

帖子

12

银币

初来乍到

Rank: 1

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

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 13:07:33 | 显示全部楼层
例程在这行代码中不查找除活动文档之外的任何文件:
 
Dim doc As Document=应用程序。DocumentManager。MdiActiveDocument
 
 
然而,作为为AutoCAD命令行设计的例程,它可能缺少与用户窗体一起使用所需的一些参数。
 
当您单步执行合成代码时,哪一行会产生错误?
回复

使用道具 举报

2

主题

14

帖子

12

银币

初来乍到

Rank: 1

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

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

2

主题

14

帖子

12

银币

初来乍到

Rank: 1

铜币
10
发表于 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代码了。如果你有几分钟的时间,我当然需要你的帮助。。。
 
皮特(一个特大号的谢谢!)
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-5 04:32 , Processed in 0.627326 second(s), 72 queries .

© 2020-2025 乐筑天下

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