首页 > 编程语言 >B2_C# CAD-2

B2_C# CAD-2

时间:2023-05-15 18:34:31浏览次数:31  
标签:ActiveDocument MessageFilter C# 命令 AcadApp oldFilter B2 CAD

和Visual Lisp 不同,C#要和CAD交互,需要建立交互环境。
不同的CAD版本,略有差异,本文以CAD 2013为例说明。

1. 添加引用

增加下面2个文件:acax19enu.tlb ,axdb19enu.til;
这两个文件在Autodesk Shared目录下:
image
添加引用:
image
image

2. 建立连接

将打开CAD命令放到try 和catch 中是非常必要的,要判断AutoCAD是否打开,如果没有打开,要打开。

点击查看代码
        try
            {
                AcadApp = (AcadApplication)System.Runtime.InteropServices.Marshal.GetActiveObject("AutoCAD.Application.19");
            }
            catch
            {
                AcadApp = new AcadApplicationClass();
            }

3. 执行CAD命令

插入一个块的买命令如下:

点击查看代码
            AcadApp.ActiveDocument.Utility.Prompt("给定插入点:");
            insertionPoint = (double[])AcadApp.ActiveDocument.Utility.GetPoint();
            Function_CAD.InsertBlock(AcadApp, insertionPoint, "电机主回路-全抽屉");   //主回路

为了便于管理,所以相关的CAD功能都集成在一个文件中:Function_CAD;
public static void InsertBlock(AcadApplication AcadApp, double[] StartingXPoint, string BlockName)
{
AcadBlockReference blockObj;
MessageFilter.Register();
blockObj = AcadApp.ActiveDocument.ModelSpace.InsertBlock(StartingXPoint, BlockName, 1, 1, 1, 0);
MessageFilter.Revoke();
}

4. 需要注意的问题

如果CAD命令没有执行完或者同步出现问题,系统会出现以下错误:

image

将要执行的命令放到下面语句中间,可以很好的解决这个问题:
MessageFilter.Register();
需要执行的CAD命令
MessageFilter.Revoke();

点击查看代码
  public static void Register()
        {
            IOleMessageFilter newFilter = new MessageFilter();
            IOleMessageFilter oldFilter = null;
            CoRegisterMessageFilter(newFilter, out oldFilter);
        }

        // Done with the filter, close it.
        public static void Revoke()
        {
            IOleMessageFilter oldFilter = null;
            CoRegisterMessageFilter(null, out oldFilter);
        }

上述代码是微软的开源代码;

5. 执行结果

设置断点,监视执行:
image
在指定位置插入相应的块:
image

标签:ActiveDocument,MessageFilter,C#,命令,AcadApp,oldFilter,B2,CAD
From: https://www.cnblogs.com/jihhh/p/17401873.html

相关文章

  • C#学习之time控件和timer_tick事件
    https://blog.csdn.net/ycigwy/article/details/70242669Timer控件:Timer控件只有绑定了Tick事件,和设置Enabled=True后才会自动计时,停止计时可以用Stop()控制,通过Stop()停止之后,如果想重新计时,可以用Start()方法来启动计时器。Timer控件和它所在的Form属于同一个线程;timer1_Tick:......
  • 反序列化漏洞-Apache Shiro
    ApacheShiro一、shiro的相关介绍1、Shiro概述ApacheShiro是一个强大易用的Java安全框架,提供了认证、授权和会话管理等功能。Shiro框架直观、易用,同时也能提供更健壮的安全性。2、Shiro历史漏洞(Shiro-550)​ApacheShiro框架提供了记住我的功能(RememberMe),用户登录成......
  • 使用C++实现贝塞尔曲线算法平滑多边形
    定义一个函数来计算贝塞尔曲线的坐标,并使用循环来更新坐标。把坐标连接起来,就可以得到一个平滑的多边形。例如:可以使用贝塞尔曲线或B样条曲线来实现曲线平滑。这两种曲线都是由一组控制点构成的,并且可以通过调整控制点来调整曲线形状。贝塞尔曲线是一种由多个点组成的曲线,其中每......
  • 使用 Easysearch,日志存储少一半
    在海量日志存储场景中,索引膨胀率是一个关键指标,直接影响存储成本和查询性能。它表示原始数据与索引数据在磁盘上所占空间的比率。较高的索引膨胀率不仅增加了存储成本,而且可能会影响查询速度,尤其是在I/O密集型的查询中。因此,我们需要密切关注和优化索引膨胀率。接下来,我们将比较......
  • 一图看懂CodeArts Deploy 5大特性,带你玩转部署服务
    华为云持续部署服务CodeArtsDeploy,通过模块化自由编排部署流程,实现软件的自动化部署,基于其易入门、功能全、集成度高、自动化、可靠的部署能力,能够帮您快速实现业务上云,全面提升软件的交付效率,显著提升交付质量! 产品详情地址:部署CodeArtsDeploy_一键部署到云主机和容器_多种部署......
  • MobTech MobPush|助力预热618
    618是电商平台的年中大促,各大平台都会推出各种优惠活动和玩法来吸引消费者。在这样的背景下,如何提高用户的购买意愿和转化率,是电商运营者面临的重要挑战。MobPush作为专业免费的推送SDK,提供智能化的推送服务,可以帮助电商预热购物活动,提升用户粘性和活跃度,增加订单量和收入。MobPush......
  • 龙蜥产品生态总监做客 InfoQ:后 CentOS 时代,国产操作系统能否扛起大旗?
    随着CentOS全面停服即将进入尾声,企业选择一款既可保障系统稳定运行,又可提供专业技术支持的操作系统迁移显得尤为重要。那么,现存的CentOS以及衍生版用户或将面临哪些风险?一套完整的迁移方案应该包括哪些步骤?在当下众多的迁移版本中如何选择符合市场发展诉求的操作系统……相信大......
  • LeetCode 226. 翻转二叉树
    题目链接:LeetCode226.翻转二叉树题意:给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。解题思路:对于每一个节点,只需要考虑反转当前节点的左右子树即可,因此只需要考虑遍历顺序,本题中,采用前序和后序遍历都是可以的,但是中序遍历不行,如果采用中序,会将某些节点反转两......
  • 记录--css水滴登录界面
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言今天我们来分享一款非常有趣的登录界面,它使用HTML和CSS制作,具有动态的水波纹效果,让用户在登录时感受到了一股清凉之感。基本html框架<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8">......
  • APP自动化-conftest
    我们知道在python中要想实现数据的共享,可以定义一个“全局变量”,在另一个文件中使用的时候通过先导入,再使用的方式来访问。pytest中定义个conftest.py来实现数据,参数,方法、函数的共享。conftest.py的文件名称是固定的,pytest会自动识别该文件,我们可以理解成一个专门存放fixture......