3

我有两张图纸,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实现后期绑定和复制对象的目的

谢谢

4

1 回答 1

0

您可以后期绑定强制转换为对象。

http://www.dicks-clicks.com/excel/olBinding.htm

您可以使用实体:http: //msdn.microsoft.com/en-us/library/gg309272.aspx

或 Dynamic 并强制转换为类似的对象定义或属性包,如果您愿意的话。

在 Microsoft Dynamics CRM 2011 和 Microsoft Dynamics CRM Online 中,您可以在使用实体时使用实体类。在 Microsoft Dynamics CRM 4.0 中,您使用了 DynamicEntity 类。初始化时,Entity 类包含实体的逻辑名称和实体属性的属性包数组。这使您可以使用后期绑定,以便您可以使用在编译应用程序时不可用的类型,例如自定义实体和自定义属性。因为实体基类始终包含属性和值的属性包,所以不再需要 Microsoft Dynamics CRM 4.0 中的 ReturnDynamicsEntities 属性。早期绑定和后期绑定的主要区别在于类型转换。虽然早期绑定提供了所有类型的编译时检查,因此不会发生隐式转换,后期绑定仅在创建对象或对类型执行操作时检查类型。Entity 类需要显式指定类型以防止隐式强制转换。

它可能看起来像这样

blockCollection[0] = (ACadBlock)oSourceFile.Blocks.Item("b1");

于 2013-09-19T00:46:22.750 回答