ObjectARX:COM:InsertBlock()
有人知道“密码”值应该是多少吗?使用C#时,最后一个值没有覆盖,当我试图使用我能想到的任何对象时,我会出现一个可怕的错误。。。即使是IAcadSecurityParams的值。暗语
帮助 如果您正在使用:
数据库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;
}
. . . . .
有趣的
我试着给它传递一个空字符串;没有运气。我明白了
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一样毫无问题地进行其他操作。。。但由于某些原因,这不起作用。。。 关于在严格管理的代码环境中的调用,null也可以作为“”的替换。
我无法告诉您为什么基于该异常的代码不工作。
使用COM互操作是否必要?X、Y和Zscale是否关键?如果是这样,您是否可以使用:
Database.Insert Method (Matrix3d, Database, bool)
是否将适当的矩阵设置为比例? 哦哦。
所以,当我使用数据库时。insert(),其中“数据库”是我希望插入块的图形的数据库。所述块被放置在Paperspace表中,而不是modelspace?现在我可以发誓,文档中声明“insert()”将源blockrecord放置在数据库的modelspace块记录中。。。。
哎呀,我编辑而不是回复!
除上述问题外,我还注意到以下问题:
插入块时,可见属性(文本)未正确对齐。。。除非其DXF作为输出!DXF一切都显示正确。。。DWG。。。一切都结束了。在动态块的情况下,如果切换可见性状态,即使选择了当前(默认)状态,属性也会正确重新对齐。。。。
我不得不同意,帮助文档中使用的措辞往往具有误导性。
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
谢谢你的回复。昨晚我修复了模型空间问题上的错误。我的数据库被破坏了!
至于第二个问题:我成功地插入了块并粘贴了属性引用。。。我觉得奇怪的是,DXF输出会在正确的位置显示可见属性,而DWG输出不会(它们会在块的插入点显示)。。。
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并且值更改(甚至保持不变)时,属性将“移动”到正确的位置!
我被难住了!
嗯,我唯一能告诉你的是,我把你的潜艇插入了这里的一个设置,一切都更新了。
也许看看调用例程,它会对块引用应用任何后续调整来修改其转换矩阵吗?
页:
[1]
2