明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 847|回复: 9

请教一下,如何在后期绑定中创建面域呢?

[复制链接]
发表于 2016-4-6 10:17 | 显示全部楼层 |阅读模式
   在c#中 通过activex方式操作AutoCAD,代码如下:

                dynamic[] circleObj=new dynamic[1]
                double[] calpt = new double[3];
                calpt[0] = 0; calpt[1] = 0; calpt[2] = 0;

                 circleObj[0] = AcadDoc.ModelSpace.AddCircle(cirPt, 10);
                //生成面域
                dynamic[] regionObject;
                regionObject = (dynamic[])AcadDoc.ModelSpace.AddRegion(circleObj); //执行到这句出现: 对象数组无效 错误
                dynamic profileRegionObject = (dynamic)(regionObject[0]);


调试的时候发生如下错误: 对象数组无效

请问各位有什么好的解决办法?
发表于 2016-4-6 11:17 | 显示全部楼层
本帖最后由 Real_King 于 2016-4-6 11:21 编辑

public virtual dynamic AddRegion(object ObjectList)返回值为dynamic

或者试试(object[])AcadDoc.ModelSpace.AddRegion()
 楼主| 发表于 2016-4-6 12:28 | 显示全部楼层
Real_King 发表于 2016-4-6 11:17
public virtual dynamic AddRegion(object ObjectList)返回值为dynamic

或者试试(object[])AcadDoc.Mode ...

(object[])AcadDoc.ModelSpace.AddRegion() 这种方法也出现相同的错误.

public virtual dynamic AddRegion(object ObjectList) 这个如何用的?
发表于 2016-4-6 14:34 | 显示全部楼层
SurveyCAD 发表于 2016-4-6 12:28
(object[])AcadDoc.ModelSpace.AddRegion() 这种方法也出现相同的错误.

public virtual dynamic AddRe ...

给你来个实例吧
Acad3DSolid damObjectCopy;
Acad3DPolyline[] polyline = new Acad3DPolyline[1];
AcadRegion regionObj;
try
{
damObjectCopy = (Acad3DSolid)damObject.Copy();
double[] regionCoords = new double[12], minPoint = new double[3], maxPoint = new
double[3];
object minPointObject, maxPointObject;
damObjectCopy.GetBoundingBox(out minPointObject, out maxPointObject);
minPoint = (double[])minPointObject;
maxPoint = (double[])maxPointObject;
regionCoords[0] = minPoint[0]; regionCoords[1] = minPoint[1]; regionCoords[2] =
startHeight;
regionCoords[3] = maxPoint[0]; regionCoords[4] = minPoint[1]; regionCoords[5] =
startHeight;
regionCoords[6] = maxPoint[0]; regionCoords[7] = maxPoint[1]; regionCoords[8] =
startHeight;
regionCoords[9] = minPoint[0]; regionCoords[10] = maxPoint[1]; regionCoords[11] =
startHeight;
polyline[0] = AcadDoc.ModelSpace.Add3DPoly(regionCoords);
polyline[0].Closed = true;
object[] tempObject;
tempObject = (object[])AcadDoc.ModelSpace.AddRegion(polyline);
regionObj = (AcadRegion)(tempObject[0]);
Acad3DSolid boolObjectB;
boolObjectB = AcadDoc.ModelSpace.AddExtrudedSolid(regionObj, endHeight - startHeight,
0.0);
damObjectCopy.Boolean(AcBooleanType.acIntersection, boolObjectB);
damObjectCopy.Layer = "划分后模型";
polyline[0].Delete();
regionObj.Delete();
}
catch
{
polyline[0].Delete();
erroInfoRichTextBox.Text += "在划分模型" + damObject.Layer.ToString()
+ "时:高程"+startHeight.ToString()+"至"+endHeight.ToString()+"出错!\n";
}
 楼主| 发表于 2016-4-6 14:38 | 显示全部楼层
Real_King 发表于 2016-4-6 14:34
给你来个实例吧
Acad3DSolid damObjectCopy;
Acad3DPolyline[] polyline = new Acad3DPolyline[1];

你这个是在前期绑定中可以吧? 在后期绑定中是 没有AcadRegion ,Acad3DSolid 等等实体定义的.
发表于 2016-4-6 15:35 | 显示全部楼层
本帖最后由 Real_King 于 2016-4-6 15:50 编辑
SurveyCAD 发表于 2016-4-6 14:38
你这个是在前期绑定中可以吧? 在后期绑定中是 没有AcadRegion ,Acad3DSolid 等等实体定义的.

把你的circleObj在作为参数时强类型化一下试试,或者直接强类型化circleObj[0]
 楼主| 发表于 2016-4-7 07:54 | 显示全部楼层
Real_King 发表于 2016-4-6 15:35
把你的circleObj在作为参数时强类型化一下试试,或者直接强类型化circleObj[0]

由于是后期绑定,没法强类型化啊!
 楼主| 发表于 2016-4-7 09:59 | 显示全部楼层
Real_King 发表于 2016-4-6 15:35
把你的circleObj在作为参数时强类型化一下试试,或者直接强类型化circleObj[0]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Reflection;
using stdole;

namespace TlsCad.RunTime
{
    public partial class Form1 : Form
    {
        public Form1()
        {

            //获取当前AutoCad实例
            string pid = "AutoCad.Application";
            dynamic app;
            try
            {
                app = Marshal.GetActiveObject(pid);
            }
            catch
            {
                //如果没有就创建之
                Type t = Type.GetTypeFromProgID(pid);
                app = Activator.CreateInstance(t);
                app.Visible = true;
            }

            //获取当前文档
            dynamic doc = app.ActiveDocument;

            double[] p1 = { 0, 0, 0 };
            double[] p2 = { 0, 10, 0 };
            double[] p3 = { 10, 10, 0 };
            double[] p4 = { 10, 0, 0 };

            //Com对象数组必须封装为IDispatch数组
            //注意应引用stdole.dll
            IDispatch[] ents =
            {
                doc.ModelSpace.AddLine(p1, p2),
                doc.ModelSpace.AddLine(p2, p3),
                doc.ModelSpace.AddLine(p3, p4),
                doc.ModelSpace.AddLine(p4, p1)
            };

            //测试生成面域
            dynamic r = doc.ModelSpace.AddRegion(ents);
            double[] min, max;
            r[0].GetBoundingBox(out min, out max);
            app.ZoomWindow(min, max);

            InitializeComponent();

        }
    }
}

这是 雪山飞狐_lzh 通过后期绑定生成面域的程序,但是我执行的时候,只是画了一个正方形,并没有成功创建一个面域,请问是什么原因呢?
发表于 2016-4-23 16:12 | 显示全部楼层
SurveyCAD 发表于 2016-4-7 09:59
using System;
using System.Collections.Generic;
using System.ComponentModel;

经测试是可以的,你再检查下代码。
 楼主| 发表于 2016-4-25 12:12 | 显示全部楼层
xiaodoo 发表于 2016-4-23 16:12
经测试是可以的,你再检查下代码。

已经成功了,多谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-24 20:39 , Processed in 0.234743 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表