乐筑天下

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

[编程交流] ObjectARX:COM:InsertBlock()

[复制链接]

10

主题

23

帖子

11

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 15:15:18 | 显示全部楼层 |阅读模式
有人知道“密码”值应该是多少吗?
 
使用C#时,最后一个值没有覆盖,当我试图使用我能想到的任何对象时,我会出现一个可怕的错误。。。即使是IAcadSecurityParams的值。暗语
 
帮助
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 15:25:55 | 显示全部楼层
如果您正在使用:
 
数据库ReadDwgFile方法(string,FileShare,[MarshalAs(UnmanagedType.U1)]bool,string)
 
并且没有相关的密码,那么你应该能够只传入一个空字符串。例如:
 
  1. . . . . .
  2. Database dbIns = new Database(false, false);
  3. try
  4. {
  5.            // Read the 'strPath' file into the new database.                               
  6.    dbIns.ReadDwgFile(strPath, System.IO.FileShare.Read, true, "");
  7.            // Try to insert our the dwg file as a block and get the return id of
  8.            // the new block table record.
  9.    BlockID = db.Insert(blockName, dbIns, true);
  10. }
  11. catch
  12. {
  13.    BlockID = ObjectId.Null;
  14. }
  15. . . . . .
回复

使用道具 举报

10

主题

23

帖子

11

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 15:28:19 | 显示全部楼层
 
 
有趣的
 
我试着给它传递一个空字符串;没有运气。我明白了
 
  1. Unhandled Exception: System.Runtime.InteropServices.COMException (0x8000FFFF): C
  2. atastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))
  3.   at AXDBLib.AcadModelSpaceClass.InsertBlock(Object InsertionPoint, String Name
  4. , Double Xscale, Double Yscale, Double Zscale, Double Rotation, Object Password)
  5.   at asapDWGEngine.asapHost.test() in C:\asapDWGEngine\asapDWGEngine\asapHost.c
  6. s:line 60
  7.   at asapDWGEngine.Program.Main(String[] args) in C:\asapDWGEngine\asapDWGEngin
  8. e\Program.cs:line 26

 
DWG上没有密码。。。人力资源管理。。。
 
我通过db调用加载图形。ReadDwgFile(),将工作数据库设置为加载的DWG。。。根据我看到的一些示例,将一个AcadDatabase对象设置为db(typecast)。。。没有运气。我可以像通过COM一样毫无问题地进行其他操作。。。但由于某些原因,这不起作用。。。
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 15:38:36 | 显示全部楼层
关于在严格管理的代码环境中的调用,null也可以作为“”的替换。
 
我无法告诉您为什么基于该异常的代码不工作。
 
使用COM互操作是否必要?X、Y和Zscale是否关键?如果是这样,您是否可以使用:
 
  1. Database.Insert Method (Matrix3d, Database, [MarshalAs(UnmanagedType.U1)] bool)

 
是否将适当的矩阵设置为比例?
回复

使用道具 举报

10

主题

23

帖子

11

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 15:42:36 | 显示全部楼层
哦哦。
 
所以,当我使用数据库时。insert(),其中“数据库”是我希望插入块的图形的数据库。所述块被放置在Paperspace表中,而不是modelspace?现在我可以发誓,文档中声明“insert()”将源blockrecord放置在数据库的modelspace块记录中。。。。
回复

使用道具 举报

10

主题

23

帖子

11

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 15:49:15 | 显示全部楼层
 
哎呀,我编辑而不是回复!
 
除上述问题外,我还注意到以下问题:
 
插入块时,可见属性(文本)未正确对齐。。。除非其DXF作为输出!DXF一切都显示正确。。。DWG。。。一切都结束了。在动态块的情况下,如果切换可见性状态,即使选择了当前(默认)状态,属性也会正确重新对齐。。。。
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 15:52:33 | 显示全部楼层
 
我不得不同意,帮助文档中使用的措辞往往具有误导性。
 
db。插入方法将传入数据作为新的BlockTableRecord添加到块表中。然后,可以将该特定块作为块引用插入到任何其他BlockTableRecord中。如果这样设置:
  1. . . . . .
  2. BlockTableRecord currSpace = tr.GetObject( db.CurrentSpaceId, OpenMode.ForWrite ) as BlockTableRecord;
  3.               
  4. BlockReference bref = new BlockReference( ppr.Value, id );
  5. currSpace.AppendEntity( bref  );
  6. . . . . .

 
然后块引用将出现在当前的任何空间中。
 
 
 
看看这根线是否与那种情况有关。
http://www.cadtutor.net/forum/showthread.php?t=28819
回复

使用道具 举报

10

主题

23

帖子

11

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 16:00:08 | 显示全部楼层
 
谢谢你的回复。昨晚我修复了模型空间问题上的错误。我的数据库被破坏了!
 
至于第二个问题:我成功地插入了块并粘贴了属性引用。。。我觉得奇怪的是,DXF输出会在正确的位置显示可见属性,而DWG输出不会(它们会在块的插入点显示)。。。
回复

使用道具 举报

10

主题

23

帖子

11

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 16:04:16 | 显示全部楼层
  1.        Shared Sub ApplyAttributeDef(ByRef BlockReference As Autodesk.AutoCAD.DatabaseServices.BlockReference)
  2.            Dim Block As BlockTableRecord = BlockReference.BlockTableRecord.GetObject(Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead)
  3.            If Not Block.HasAttributeDefinitions Then Exit Sub
  4.            If Block.Database Is Nothing Then Exit Sub
  5.            Dim Trans As Transaction = Block.Database.TransactionManager.StartTransaction
  6.            Try
  7.                If BlockReference.Database Is Nothing Then Block.Database.AddDBObject(BlockReference)
  8.                For Each Id As ObjectId In Block
  9.                    Dim Ent As Entity = Id.GetObject(Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead)
  10.                    If TypeOf Ent Is AttributeDefinition Then
  11.                        Dim AttDef As AttributeDefinition = Ent
  12.                        Dim AttRef As New AttributeReference
  13.                        BlockReference.AttributeCollection.AppendAttribute(AttRef)
  14.                        AttRef.SetPropertiesFrom(AttDef)
  15.                        AttRef.SetAttributeFromBlock(AttDef, BlockReference.BlockTransform)
  16.                        Trans.AddNewlyCreatedDBObject(AttRef, True)
  17.                    End If
  18.                Next
  19.                Trans.Commit()
  20.            Catch ex As Autodesk.AutoCAD.Runtime.Exception
  21.                Trans.Abort()
  22.            Finally
  23.                Trans.Dispose()
  24.            End Try
  25.        End Sub

 
上面的子部分是我如何应用属性defs的,我得到的结果(同样,仅在DWG输出中,而不是在DXF输出中)被附加。
 
正如您所看到的,可见属性(文本,本例中的数字“1”)确实出现了。。。但是,它应该在块内居中(矩形和内接圆)。当用户在图形中双击blockref并且值更改(甚至保持不变)时,属性将“移动”到正确的位置!
 
我被难住了!
161521k6aanhigok10g7ss.jpg
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 16:14:31 | 显示全部楼层
嗯,我唯一能告诉你的是,我把你的潜艇插入了这里的一个设置,一切都更新了。
 
也许看看调用例程,它会对块引用应用任何后续调整来修改其转换矩阵吗?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 19:21 , Processed in 0.731737 second(s), 74 queries .

© 2020-2025 乐筑天下

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