askrius 发表于 2022-7-6 15:15:18

ObjectARX:COM:InsertBlock()

有人知道“密码”值应该是多少吗?
 
使用C#时,最后一个值没有覆盖,当我试图使用我能想到的任何对象时,我会出现一个可怕的错误。。。即使是IAcadSecurityParams的值。暗语
 
帮助

SEANT 发表于 2022-7-6 15:25:55

如果您正在使用:
 
数据库ReadDwgFile方法(string,FileShare,bool,string)
 
并且没有相关的密码,那么你应该能够只传入一个空字符串。例如:
 
. . . . .

Database dbIns = new Database(false, false);
try
{
           // Read the 'strPath' file into the new database.                               
   dbIns.ReadDwgFile(strPath, System.IO.FileShare.Read, true, "");
           // Try to insert our the dwg file as a block and get the return id of
           // the new block table record.
   BlockID = db.Insert(blockName, dbIns, true);
}
catch
{
   BlockID = ObjectId.Null;
}

. . . . .

askrius 发表于 2022-7-6 15:28:19

 
 
有趣的
 
我试着给它传递一个空字符串;没有运气。我明白了
 
Unhandled Exception: System.Runtime.InteropServices.COMException (0x8000FFFF): C
atastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))
at AXDBLib.AcadModelSpaceClass.InsertBlock(Object InsertionPoint, String Name
, Double Xscale, Double Yscale, Double Zscale, Double Rotation, Object Password)
at asapDWGEngine.asapHost.test() in C:\asapDWGEngine\asapDWGEngine\asapHost.c
s:line 60
at asapDWGEngine.Program.Main(String[] args) in C:\asapDWGEngine\asapDWGEngin
e\Program.cs:line 26

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

SEANT 发表于 2022-7-6 15:38:36

关于在严格管理的代码环境中的调用,null也可以作为“”的替换。
 
我无法告诉您为什么基于该异常的代码不工作。
 
使用COM互操作是否必要?X、Y和Zscale是否关键?如果是这样,您是否可以使用:
 
Database.Insert Method (Matrix3d, Database, bool)
 
是否将适当的矩阵设置为比例?

askrius 发表于 2022-7-6 15:42:36

哦哦。
 
所以,当我使用数据库时。insert(),其中“数据库”是我希望插入块的图形的数据库。所述块被放置在Paperspace表中,而不是modelspace?现在我可以发誓,文档中声明“insert()”将源blockrecord放置在数据库的modelspace块记录中。。。。

askrius 发表于 2022-7-6 15:49:15

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

SEANT 发表于 2022-7-6 15:52:33

 
我不得不同意,帮助文档中使用的措辞往往具有误导性。
 
db。插入方法将传入数据作为新的BlockTableRecord添加到块表中。然后,可以将该特定块作为块引用插入到任何其他BlockTableRecord中。如果这样设置:
. . . . .
BlockTableRecord currSpace = tr.GetObject( db.CurrentSpaceId, OpenMode.ForWrite ) as BlockTableRecord;
            
BlockReference bref = new BlockReference( ppr.Value, id );
currSpace.AppendEntity( bref);
. . . . .
 
然后块引用将出现在当前的任何空间中。
 
 
 
看看这根线是否与那种情况有关。
http://www.cadtutor.net/forum/showthread.php?t=28819

askrius 发表于 2022-7-6 16:00:08

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

askrius 发表于 2022-7-6 16:04:16


       Shared Sub ApplyAttributeDef(ByRef BlockReference As Autodesk.AutoCAD.DatabaseServices.BlockReference)
         Dim Block As BlockTableRecord = BlockReference.BlockTableRecord.GetObject(Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead)
         If Not Block.HasAttributeDefinitions Then Exit Sub
         If Block.Database Is Nothing Then Exit Sub
         Dim Trans As Transaction = Block.Database.TransactionManager.StartTransaction
         Try
               If BlockReference.Database Is Nothing Then Block.Database.AddDBObject(BlockReference)
               For Each Id As ObjectId In Block
                   Dim Ent As Entity = Id.GetObject(Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead)
                   If TypeOf Ent Is AttributeDefinition Then
                     Dim AttDef As AttributeDefinition = Ent
                     Dim AttRef As New AttributeReference
                     BlockReference.AttributeCollection.AppendAttribute(AttRef)
                     AttRef.SetPropertiesFrom(AttDef)
                     AttRef.SetAttributeFromBlock(AttDef, BlockReference.BlockTransform)
                     Trans.AddNewlyCreatedDBObject(AttRef, True)
                   End If
               Next
               Trans.Commit()
         Catch ex As Autodesk.AutoCAD.Runtime.Exception
               Trans.Abort()
         Finally
               Trans.Dispose()
         End Try
       End Sub

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

SEANT 发表于 2022-7-6 16:14:31

嗯,我唯一能告诉你的是,我把你的潜艇插入了这里的一个设置,一切都更新了。
 
也许看看调用例程,它会对块引用应用任何后续调整来修改其转换矩阵吗?
页: [1] 2
查看完整版本: ObjectARX:COM:InsertBlock()