乐筑天下

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

VB.net用户控件包含autodesk对象引用问题

[复制链接]

1

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
5
发表于 2020-1-8 02:48:56 | 显示全部楼层 |阅读模式
这是我在这个论坛上的第一篇文章,通常我会找到一个解决方案,但这次我不能。这个问题不适用于像stackoverflow这样的论坛,因为它与autodesk api密切相关。这可能是Autodesk autocad / civil 3d开发人员论坛上的帖子,但Autodesk人员不再参与,我认为这个问题对于其他成员来说非常独特。我使用“网络用户控制问题”进行了研究,但是...所以我来了。每次我制作一个新程序时,我都必须从头开始做所有的UI。所以我决定创建用户控件,例如,一个用户控件,用于获取 dwg 的走廊,并将它们放在组合框的下拉列表中。所以我创造了一个,在编译旁边,组件会自动添加到工具箱中。尝试将其添加到表单中,我收到一条失败消息,它会自动从工具箱中删除。我发现,如果我在下面添加行,一切都可以正常工作Public currentCRDRobj As Autodesk.Civil.DatabaseServices.Corridor。
公共列表作为新列表的Corridor名称(字符串)我还尝试输入一个对齐对象,它工作正常。但是,如果我在下面添加一行,我有我提到的问题Public currentCRDRid As Autodesk.AutoCAD.DatabaseServices.ObjectId = Autodesk.AutoCAD.DatabaseServices.ObjectId.Null。
Public ListOfCorridorObjects As new List(Of Autodesk.Civil.DatabaseServices.Corridor)因此,民用3d自定义对象(如走廊或路线)没有问题,但是当它们在ListOf中设置时存在问题。此外,每个程序的基础,将 Autodesk 自定义对象 ID 分配给变量,也会导致问题。我附加了一个简单的VisualStudio 2017-Civil 3D 2018 vb.net 解决方案,其中包含UserControl和Form来测试压缩文件。基本解决方案文件位于“CorridorBaselineStationsAddByFile”文件夹中,加载此解决方案。这些路径与我的pc文件夹相关,因此必须重新加载项目。项目 :autoCAD_Civil3D_2018_r2_UserControls包含用户控件UserControl1.vb项目 : TKV_CorridorBaselineStationsAddByFile包含删除用户控件的表单 frmCorridorBaselineStationsAddByFile.vb项目构建顺序不是问题,重新编译解决方案。它将取得成功,将焦点设置在“frmCorridorBaselineStationsAddByFile.vb[设计]选项卡中。将在工具箱中创建一个名为”autoCAD_Civil3D_2018_r2_UserControls组件“的新文件夹,它将包含“UserControl1”组件。现在将此组件拖放到窗体中,一切都很好。现在将焦点设置为“用户控件1.vb”,导致问题的行设置为注释状态。通过删除 '.重新编译解决方案并将焦点设置为“frmCorridorBaselineStationsAddByFile.vb [Design] tab.voila !选择“忽略并继续”,然后选择“是”,然后选择...“。UserControl1消失了,尽管它存在于“UserControl1.Designer.vb”。不应显示此消息,这是谁的错?矿山?欧特克的 ?微软的?混合 ?现在将焦点重置为“用户控件1.vb”。取消注释“公共当前CRDRid”,重新编译解决方案并将焦点设置为“frmCorridorBaselineStationsAddByFile.vb[设计]选项卡。选择”忽略并继续“,然后选择”是”。显示不同的错误消息,现在转到工具箱。该组件仍然存在,尝试拖放它。哎呀,它消失了。有什么想法吗?我做错了什么吗?我应该尝试在Autodesk autocad/civil 3D dev论坛上发帖吗?。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

4

主题

219

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
238
发表于 2020-1-8 11:06:07 | 显示全部楼层
这是因为表单设计器在Visual Studio中的工作方式:当要在表单设计器中显示UI(用户控件或表单)时,必须创建UI类的实际实例,因此,您的代码在默认构造函数中创建的任何内容都将被实例化,并且由“…声明为新…”的任何内容。在您的情况下,在创建表单实例时(在VS的表单设计器中),此行始终运行作为新列表(Autodesk.Civil.DatabaseServices.Corridor)的更正对象的公共列表。由于inst实例化需要知道Civil3D走廊所需的内存,而这些内存只能在运行的Civil3D会话中才能知道,因此表单设计器崩溃
我没有下载/查看您的代码,但我可以看到您的数据和UI非常融合。这不是一个好的实践,尤其是当您在做UI组件时。您可能希望遵循某种开发良好的代码模式(如视图模型控制器/演示器),以使用UI分离AutoCAD/Civil3D数据
我强烈建议将WPF UI与MVVM模式结合使用。这样,UI部件(视图)在设计时就不需要知道Acad/Civil3D的实际数据类型。只有模型/视图模型处理AutoCAD/Civil3D数据。所以,你根本不会遇到这个问题
但是,如果您不熟悉WPF UI,您可能希望尝试以下操作(不确定是否有效,但值得尝试):
将公共字段成员:
作为新列表(Autodesk.Civil.DatabaseServices.Corridor)
更改为公共属性:
Private_corrdors As List(Of Corridor)=Nothing
公共只读属性ListofCorrdors()(Of Corridors)
Get…
End属性
然后仅分配private member_。您也可以将其分配到默认构造函数之外的构造函数中(没有参数输入的构造函数,因为VS form designer使用它),例如:
部分类MyUserControl
继承UserControl
“”默认构造函数
公共子新建()
初始化组件()
End Sub
“”自定义构造函数
Public子新建([一些输入参数])
MyBase。New()
..
_roads=New List(of roads)(
..
End Sub
结束类
这样,VS中的表单设计器可以使用默认构造函数实例化表单/用户控件,而无需弄清楚如何将内存分配给AutoCAD/Civil3D类型,只要这些数据的变量为Nothing/Null即可
同样,使用WPF将是一种更好的方式,我想。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2024-11-22 04:44 , Processed in 0.150795 second(s), 61 queries .

© 2020-2024 乐筑天下

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