我有两张图,dg1和dg2。我在dg1中定义了一个块'b1',我想在dg2中复制它。它在早期绑定中运行良好,但在后期绑定中尝试代码时出错。有问题的代码是:
private void Form1_Load(object sender, EventArgs e)
{
AcadApplication m_oAcadApp = null;
AcadCircle circle = null;
AcadAcCmColor color = null;
AcadDocument oSourceFile = null;
AcadDocument m_oActiveDoc = null;
try
{
object obj = Marshal.GetActiveObject("AutoCAD.Application.17");
if (obj != null)
{
m_oAcadApp = obj as AcadApplication;
m_oActiveDoc = m_oAcadApp.ActiveDocument;
foreach (AcadDocument oTempDoc in m_oAcadApp.Documents)
{
if((@"c:\d1.dwg").ToUpper() == oTempDoc.FullName.ToUpper())
{
Console.WriteLine(oTempDoc.FullName);
oSourceFile = oTempDoc;
break;
}
}
try
{
object[] objCollection = new object[1];
objCollection[0] = null;
objCollection[0] = oSourceFile.Blocks.Item("b1");
oSourceFile.CopyObjects(objCollection, m_oActiveDoc.Blocks);
}
catch (Exception ex)
{
MessageBox.Show("Opening Blocks " + ex.Message);
}
/*double[] cen = new double[] { 0, 0, 0 };
circle = m_oAcadApp.ActiveDocument.Database.ModelSpace.AddCircle(cen, 2);
color = m_oAcadApp.GetInterfaceObject("Autocad.AcCmColor.17") as AcadAcCmColor;
color.SetRGB(150, 150, 250);
circle.TrueColor = color;
m_oAcadApp.ZoomExtents();
* */
}
}
catch (Exception ex)
{
MessageBox.Show("AutoCAD not opened");
}
finally
{
// if (color != null) Marshal.FinalReleaseComObject(color);
//if (circle != null) Marshal.FinalReleaseComObject(circle);
if (m_oAcadApp != null) Marshal.FinalReleaseComObject(m_oAcadApp);
}
}
当我尝试在其他绘图中复制块时,我得到异常:无效的对象数组异常。
如何在后期绑定中执行此操作?
我正在使用Autocad 2009.
实现Autocad的后期绑定和复制对象的目标
由于
答案 0 :(得分:0)
您可以将强制转换绑定到对象。
http://www.dicks-clicks.com/excel/olBinding.htm
您可以使用实体:http://msdn.microsoft.com/en-us/library/gg309272.aspx
或动态并转换为类似的对象定义或属性包,如果你愿意的话。
在Microsoft Dynamics CRM 2011和Microsoft Dynamics CRM Online中,您可以在使用实体时使用Entity类。在Microsoft Dynamics CRM 4.0中,您使用了DynamicEntity类。初始化时,Entity类包含实体的逻辑名称和实体属性的property-bag数组。这使您可以使用后期绑定,以便您可以使用自定义实体和自定义属性等类型,这些类型在编译应用程序时不可用。由于实体基类始终包含属性和值的属性包,因此不再需要Microsoft Dynamics CRM 4.0中的ReturnDynamicsEntities属性。 早期和晚期绑定之间的关键区别涉及类型转换。虽然早期绑定提供了所有类型的编译时检查,因此不会发生隐式转换,但只有在创建对象或对该类型执行操作时,后期绑定才会检查类型。 Entity类要求显式指定类型以防止隐式转换。
它可能看起来像这样
blockCollection [0] =(ACadBlock)oSourceFile.Blocks.Item(“b1”);