乐筑天下

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

C#net应用程序与au交互

[复制链接]

4

主题

13

帖子

9

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 22:27:06 | 显示全部楼层 |阅读模式

 
我一直在开发一个应用程序,要求用户提供将插入autocad块的信息。
到目前为止,我已经成功地打开了autocad,提取了坐标,并用我需要的属性创建了一个块。
但问题是我需要使用一个自定义块(在dwg文件中),我不知道如何将其添加到数据库,添加我需要的属性,并将其放置在图形上。下面是一些代码,试图更好地解释。
 
  1. public void insert()
  2.        {
  3.            object p;
  4.            app = OpenApp();
  5.            app.Visible = true;
  6.            AcadBlock block = null;
  7.            
  8.            p = app.ActiveDocument.Utility.GetPoint(System.Type.Missing, "Base point:");
  9.            block = app.ActiveDocument.Blocks.Add(p, "TEST");
  10.            block.AddAttribute(1.0, AcAttributeMode.acAttributeModeNormal, "TEST", p, "test tag", "test value");
  11.            block.AddAttribute(1.0, AcAttributeMode.acAttributeModeNormal, "1", p, "1", "1r");
  12.            block.AddAttribute(1.0, AcAttributeMode.acAttributeModeNormal, "2", p, "2", "2");
  13.            block.AddAttribute(1.0, AcAttributeMode.acAttributeModeNormal, "3", p, "3", "3");
  14.            app.ActiveDocument.Database.ModelSpace.AddMInsertBlock(p, "TEST", 1.0, 1.0,1.0, 0.0, 1, 1, 1, 1, System.Type.Missing);

 
我两周前才开始为autocad开发,如果有人能帮忙的话。
 
提前感谢
回复

使用道具 举报

4

主题

13

帖子

9

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 22:35:15 | 显示全部楼层
我几乎已经弄明白了。
 
现在缺少的部分是如何转换(强制转换)系统。对象[]到Autodesk。Autocad。互操作。科罗姆。属性[]。
 
在下面的代码中,我在图形上插入块,然后尝试更改其属性,然后更新块。但是
  1. bl.GetAttributes();
返回一个对象[],而不是一个属性[]。
 
 
  1. bl = app.ActiveDocument.ModelSpace.InsertBlock(p, "CARIMBO-DTE", 1.0, 1.0, 1.0, 1.0, System.Type.Missing);
  2.            AcadAttribute[] att;
  3.            object[] atr;
  4.           att = bl.GetAttributes();
  5.            
  6.            //AcadAttribute[] atr;
  7.           //atr = att;
  8.           //att = (Autodesk.AutoCAD.Interop.Common.AcadAttribute[])atr ;
  9.            
  10.            for (int i = 0; i < att.Length; i++)
  11.            {
  12.                if (att[i].TagString == "IDEDIFICIO")
  13.                {
  14.                    att[i].TextString = "TESTE";
  15.                }
  16.                //if ((Autodesk.AutoCAD.Interop.Common.AcadAttribute[])att[i].TagString == "IDEDIFICIO")
  17.                //{
  18.                //    (Autodesk.AutoCAD.Interop.Common.AcadAttribute[])att[i].TextString = "TESTE";
  19.                //}
  20.            }
  21.            bl.Update();

 
我就快到了,有人想知道吗?
回复

使用道具 举报

4

主题

13

帖子

9

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 22:42:41 | 显示全部楼层
我已经弄明白了。
 
反正是thx!
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 22:51:49 | 显示全部楼层
 
很抱歉之前没有看到这个。。。您可以发布您的解决方案,以便其他有相同问题的人可以获得帮助。
回复

使用道具 举报

4

主题

13

帖子

9

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 22:57:13 | 显示全部楼层
你好没关系。
在c语言中,我在转换系统时遇到了麻烦__ComObject to AcadAttribute尝试了几件事,但都没有成功。
所以我不得不走另一条路。
我在Autocad中创建了一个宏,从文件中读取,然后将块放置在图形上,并用属性填充。现在在c语言中,我只需要调用runMacro命令。
  1. app = openApp();
  2.            app.Visible = true;
  3.            app.RunMacro("readInfo");

 
这不是一个很好的选择,因为你必须为你想要放置的每个块创建一个文件,然后删除它,但现在它必须工作。
 
这是密码
  1. Sub insert(ByVal id As String, ByVal res As String)
  2. Dim BlockRefObj As AcadBlockReference
  3. Set BlockRefObj = ThisDrawing.ModelSpace.InsertBlock(ThisDrawing.Utility.GetPoint(, "Pick location:"), "BLOCK NAME", 1#, 1#, 1#, 0)
  4. Dim Attributes
  5. Dim i As Integer
  6. i = 0
  7. Attributes = BlockRefObj.GetAttributes
  8. For i = LBound(Attributes) To UBound(Attributes)
  9. If Attributes(i).TagString = "ID" Then
  10. Attributes(i).TextString = id
  11. End If
  12. If Attributes(i).TagString = "RES" Then
  13. Attributes(i).TextString = res
  14. End If
  15. Next i
  16. BlockRefObj.Update
  17. Set BlockRefObj = Nothing
  18. End Sub
  19. Sub readInfo()
  20. Const ForReading = 1, ForWriting = 2, ForAppending = 8, TristateFalse = 0
  21. Dim fs, f
  22. Dim id As String
  23. Dim res As String
  24. Set fs = CreateObject("Scripting.FileSystemObject")
  25. Set f = fs.OpenTextFile("c:\1.tmp", ForReading, TristateFalse)
  26. Do While f.AtEndOfStream <> True
  27. id = f.ReadLine
  28. res = f.ReadLine
  29. Loop
  30. Call insert(id, res)
  31. f.Close
  32. End Sub

 
如果有人知道如何只用c语言实现这一点,我将非常感激。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 23:08:43 | 显示全部楼层
这些链接可能很有用:
 
http://forums.autodesk.com/t5/NET/c-block-insert/td-p/1744533/page/2
 
http://forums.autodesk.com/t5/NET/Discussion-Group-ClassLibrary-please-read/td-p/3005908
回复

使用道具 举报

4

主题

13

帖子

9

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 23:16:52 | 显示全部楼层
谢谢。
我一直有麻烦,这些dll
acdmgd
admgd公司
我猜他们是用在第一个拳头环节。
我不知道他们为什么在运行时抛出异常:S
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 23:26:59 | 显示全部楼层
你使用的参考文献是否正确。。。?
 
ObjectARX SDK包括AcDbMgd。dll和AcMgd。dll(等等)。
回复

使用道具 举报

4

主题

13

帖子

9

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 23:31:16 | 显示全部楼层
我想是的。但我会试试的。谢谢
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2024-11-21 21:00 , Processed in 0.223447 second(s), 70 queries .

© 2020-2024 乐筑天下

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