VC++和OLE开发CAD

VC调用AutoCAD自动化的两种方法(包装类、接口)使用详解 在工程领域,使用AutoCAD时经常利用自动化(Automation)技术提高工作效率,VC调用AutoCAD自动化时有两种常用的方式,一个是包装类的方式,另一个是接口的方式,当然不只是AutoCAD,一般的支持Automation的软件都可以使用这两种方式,本文就这两种方式给出详细的使用方法,并简要总结各自的优缺点。文中代码基于VC6及以上。 阅读详情

用C++开发CAD,一般会选择ObjectARX,很少用OLE方式来开发,正因为很少,所以参考资料也少,帮助也少,

这点我 深有感触。为方便交流,我将近日的一些心得放在这里,还望多多指教!

  1.    启动CAD,如果安装了CAD多个版本,当我们双击一个后缀是dwg或dxf的文件

    时,默认是用最近一次启动的那个版本来打开文件,用COM启动CAD也一样。为了

     避免这种情况,需要在程序ID上修改。

  IAcadApplication app; 
 LPUNKNOWN pUnk; 
 CLSID clsid;      

 //获取Map3D的类ID
//"AutoCAD.Application.17"表示启动AutoCAD Map3D 2008
// "AutoCAD.Application.15"表示启动AutoCAD  2002,
//而 "AutoCAD.Application.16"则是CAD2005  
 ::CLSIDFromProgID(L"AutoCAD.Application.17",&clsid);    
 
 if(::GetActiveObject(clsid,NULL,&pUnk) == S_OK)//判断ACAD是否已启动
 {        //CAD已经启动,则连接CAD即可
        if (pUnk->QueryInterface(IID_IDispatch,(void**) &pDisp)== S_OK)
       {
            app.AttachDispatch(pDisp,FALSE);                      
            pUnk->Release();
      }
 }
 else 
 {      //CAD没有启动,启动CAD
        app.CreateDispatch(clsid);
  }
    app.SetVisible(TRUE);   /设置为可见
2 获取文档
 一般来说,启动CAD后即有一个默认的空白文档,如果要获取这个空白文档,就要
 可以直接这样:
     IAcadDocument oDoc=app.GetActiveDocument();
  得到,IAcadApplication::GetActiveDocument()获取活动文档。
   打开其他的文件, 调用IAcadDocument的Open函数:
   oDoc.Open(_T("D:\\test.dwg"),COlevariant(_T("")));
  要添加新的空白文档就调用:
   IAcadDocuments oDocs=app.GetDocuments();
   COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
   IAcadDocument oDoc=oDocs.Add(covOptional);
  要直接打开其他文档则调用:
   IAcadDocument oDoc=oDocs.Open(COleVariant(strPath),
            COleVaraint((short)0L),COleVariant(_T("")));
好了,到这里也可以做一小结了,我把部分实例放在这里,其他部分如
(文档操作、选择集)以后再讲:
 
BOOL GetFiles(CStringArray &filesArray)
{
  
 //...
 return TRUE;
}
BOOL OperatorCADFiles(IAcadDocument &oDoc)
{
 if(oDoc.m_lpDispatch==NULL)return FALSE;
 oDoc.SendCommand(_T("zoom e\n"));
 IAcadSelectionSets sets=oDoc.GetSelectionSets();
 IAcadSelectionSet set;
 VARIANT        vGrpVals,vtStr,vtStr2;
    BOOL           bFlag=TRUE;
 try
 {
  COleSafeArray  value,data,type,type2;
  SAFEARRAY      *GrpVals ;
  SAFEARRAYBOUND bnd;
  COleSafeArray  pt,pt2;
  IAcadPolyline  polyLine;
  double  d1[]={0,0,0} ;
  short   typei[]={8,100}; 
  long    i=0,nFictureNum;
  BOOL    bGenerateAsBlock=FALSE;   
  set=sets.Add(_T("test"));
  type.CreateOneDim(VT_I2,2,typei);
  pt.CreateOneDim(VT_R8,3,d1);
   
  bnd.lLbound = 0;
  vtStr.vt = VT_BSTR;
  vtStr.bstrVal = SysAllocString(_T("contour,0")); 
  bnd.cElements= 2;
  GrpVals = SafeArrayCreate(VT_VARIANT,1, &bnd);
  vtStr2.vt = VT_BSTR;
  vtStr2.bstrVal = SysAllocString(_T("AcDbPolyline"));
  i=0;
  SafeArrayPutElement(GrpVals,&i,&vtStr);
  i=1;
  SafeArrayPutElement(GrpVals,&i,&vtStr2 );
  vGrpVals.vt = VT_VARIANT | VT_ARRAY;
  vGrpVals.parray = GrpVals;
  //select AcDbPolyline on layers "contour" or "0" 
  set.Select(5,pt,pt,type,vGrpVals);  
  VariantClear(&vGrpVals);
  nFictureNum=set.GetCount();
  for(i=0;i<nFictureNum;i++)  
 {
   polyLine.AttachDispatch(set.Item(COleVariant(i)));
   polyLine.SetLayer(_T("new_layer"));
  }
   
 }
 catch (CException* e)
 {
  TCHAR szError[256];
  bFlag=FALSE;
  e->GetErrorMessage(szError,255);
  AfxMessageBox(szError);
 }
    set.Delete();
 set.ReleaseDispatch();
 sets.ReleaseDispatch();
 return bFlag;
}
void ReadCADFiles()
{
    IAcadApplication app;
    IAcadDocuments   oDocs; 
    CLSID            clsid;       
    CStringArray     strFilesPath;
 app.m_lpDispatch=NULL;
 ::CLSIDFromProgID(_T("AutoCAD.Application.17"),&clsid);    
 app.CreateDispatch(clsid);
    app.SetVisible(1);
 oDocs = app.GetDocuments();
   
    if(!GetFiles(strFilesPath))   
 {
  AfxMessageBox(_T("Can not find files!"));
  goto ExitFun;
 }
  
 for(int i=0;i<strFilesPath.GetSize();i++) 
 {
     IAcadDocument  oDoc=oDocs.Open(strFilesPath.GetAt(i),COleVariant((short)1),COleVariant(_T("")));
  OperatorCADFiles(oDoc);
  oDoc.Close(COleVariant((short)0),COleVariant(_T("")));
  }
ExitFun:
      oDocs.Close(); 
      app.Quit();
}
window.google_render_ad();
暑假郁闷之事,要做solidworks二次开发  期待暑假到了,想可以好好的分配时间,看一下书,补一下以前的基础知识,谁知,导师会一开,暑假走不了,要做项目。OH,我的暑假又要牺牲了。做的项目是机械学院的关于自贡硬质合金有限责任公司的solidworks 二次开发项目,软件要求如下: CAD要求实现钻头、铣刀、铰刀、丝锥、拉刀几个产品大类的CAD三维和二维二次开发,具体要求如下: 1)       使用三维平台建立以上产品模型, 阅读详情

相关推荐

零基础学CAD别被新版本带偏:先掌握画图到打印的完整闭环

CAD(计算机辅助设计)是工程制图领域的基础工具,其核心价值并不随版本迭代而改变。许多初学者热衷于追逐新版本教程,却忽略了最根本的绘图闭环能力。掌握图层管理、块定义、标注样式等高频操作,远比熟悉界面新功能更重要。从画一张简单图纸出发,理解线条绘制、对象修改、图层组织、尺寸标注到打印输出的完整流程,才是建立CAD能力的关键。在此基础上,通过插件或Python等工具实现批量修改,可以提升效率,但前提是基础操作扎实。本文从CAD学习的真实路径切入,解析零基础用户如何避开无效学习,快速掌握可交付图纸的生产力技能,并

weixin_34072458的博客 401

VB操作CAD

Dim xlapp As Excel.Application Dim xlbook As Excel.Workbook Dim sheet As Excel.Worksheet Dim Range As Excel.Range Dim zwcadapp As ZwcadApplication ...

weixin_30609287的博客 851

C/C++基础讲解(九十四)之综合实例篇(综合CAD系统)

程序主要是基于Turbo C++ 4.0 Windows 7 Windows 8 64Bit Version进行编译完成了,有兴趣的小伙伴可以自己安装下Turbo C++ 4.0 Windows 7 Windows 8 64Bit Version,网上有现成的教程,当然了,如果有问题,也可以和我联系,这里我们主要讲解些源码实例,不多说了,言归正传。 C语言,做为学习其他语言的基础语言,其重要性就不言而喻了.下面我将和大家一起来学习探讨C语言的相关奥秘。 实例1:综合CAD系统

hnjzfwy的博客 900

如何学习vc++

1 vc的用处 我感觉下面一些领域比较适合于用vc: 操作系统编程,game,图形设计,corba编程,com 编程,网络编程。 我谈谈我的体会。我现在在深圳的一家公司从事IP电话网关的开发。通过这个项目,我 才真正体会到VC有多么强大,上百个线程同时工作,数据库并发访问,而且全部软件基 于COM构造,这样高性能的大型软件,只有VC方显出其英雄本色!不过,在国内,有机会 接...

weixin_30642561的博客 643

【ObjectARX(C++)-CAD二次开发调试方法】

原文链接:https://blog.youkuaiyun.com/qq_40416052/article/details/90695534。4.修改调试选项的命令栏处的路径,路径为安装的CAD的安装路径中的 acad.exe文件。项目->属性->配置属性->C/C++ ->常规 ->调试信息格式。5).工具->选项->调试->要求与原始版本完成匹配 去掉勾选。项目->属性->配置属性->链接器->调试->生成调试信息。项目->属性->配置属性->C/C++ ->优化。2). 设置生成调试信息为:是(/DEBUG)

我的博客 1652

VC开发的WCAD项目:打造个性化的AutoCAD软件

随着制造业、建筑业和各类设计领域对精确绘图和设计需求的不断增长,CAD(Computer-Aided Design,计算机辅助设计)软件已成为工程技术人员不可或缺的工具。CAD软件能够提供更为精确、高效的设计解决方案,极大地提高了设计与绘图的质量和速度。从市场需求的角度来看,具备定制化功能、能与多种设备和系统兼容的CAD软件,受到了更多企业的青睐。这些软件不仅需要支持从简单的二维绘图到复杂的三维建模,还必须提供与其他工程软件协同工作的能力。

weixin_42591908的博客 803

如何用VC++和Visual Foxpro进行ActiveX数据通讯

         在进行软件开发的过程中,如何在不同的编程工具之间进行数据交换和通讯,需要进行不断的探索和总结。我们在开发机械CAD仿真软件的过程中,遇到了在VC++中读取和修改Visual Foxpro中数据的问题。经过许多次的试验,我们通过采用自动服务器(ActiveX Automation)的方法圆满解决了这个问题。       自动服务器,以前称为OLE Automation,后来称为Ac

cnviolet的专栏 1015

C++如何用arx在AutoCAD2004中加载动态菜单

开发arx程序时,往往需要制定一个菜单。文档是一个以VC++7.0为平台,用ObjectARX2004对AutoCAD2004开发时,动态添加菜单的程序实例,并附带说明。

如何用VC++和VFP进行ActiveX数据通讯

在进行软件开发的过程中,如何在不同的编程工具之间进行数据交换和通讯,需要进行不断的探索和总结。我们在开发机械CAD仿真软件的过程中,遇到了在VC++中读取和修改Visual Foxpro中数据的问题。经过许多次的试验,我们通过采用自动服务器(ActiveX Automation)的方法圆满解决了这个问题。 ---- 自动服务器,以前称为OLE Automation,后来称为ActiveX OL

1283

VC++开发的CAD绘图软件源代码.rar

VC++开发的仿AutoCAD开发的CAD软件,可以画圆,线,多仪线,文字,圆弧等,并且可以编辑,删除,移动等操作

VC6具有初步CAD绘图功能的源代码

VC6具有初步CAD绘图功能的源代码,能够绘制基本线,宽,层,还增加,复制,镜像、移动、等 具有初步模仿ATUOCAD 基本功能矢量图绘制源代码

VC++适合做什么

下面一些领域比较适合于用vc: 操作系统编程,game,图形设计,corba编程,com      编程,网络编程。      我谈谈我的体会。我现在在深圳的一家公司从事IP电话网关的开发。通过这个项目,我      才真正体会到VC有多么强大,上百个线程同时工作,数据库并发访问,而且全部软件基      于COM构造,这样高性能的大型软件,只有VC方显出其英雄本色!不过,在国内,有机会

逗逗飞的专栏 4579

VC++图形绘制工具源代码(类似AutoCAD)

内容索引:VC/C++源码,图形处理,平面设计,图形绘制,AutoCAD  VC++编写的一款平面设计图形绘制工具的源代码,界面风格及完成的功能类似于著名的AutoCAD,虽然功能没有AutoCAD强大,但现有的这些功能也足以让你研究一阵子了!关键是思路。

CAD 2022 64位安装失败怎么办?从环境检查到常见问题全解析

在桌面级工程软件部署中,64位架构已成为大型绘图与三维建模的基础门槛。64位程序突破了32位约4GB内存上限,能更稳定地承载CAD 2022这样高负载的设计工具。然而,软件安装失败往往源于系统环境而非安装包本身,例如运行库缺失、旧版本残留、许可证服务冲突或杀毒软件误拦截。理解这一原理后,技术价值便体现在对安装前环境检查、临时文件清理、组件验证的重视上。无论是个人学习CAD制图,还是企业批量部署多台工作站,掌握系统架构确认、磁盘空间评估、日志排查等通用方法,都能显著提升一次安装的成功率。这些方法覆盖了从环境准

weixin_34293141的博客 474

广义平均(Generalized Mean, GeM)

本位介绍了广义平均操作的定义和简要推导,帮助大家理解其含义。

qq_45802280的博客 4547

Keil5与ARM编译器V5安装指南:从下载到配置全流程解析

本文提供Keil5与ARM Compiler V5的完整安装与配置指南。针对新版Keil5默认不包含V5编译器导致老工程编译失败的问题,详细解析了从软件下载、授权管理到获取并正确安装ARM Compiler V5(AC5)的全流程,确保开发者能顺利搭建兼容老项目的稳定开发环境。

weixin_29158047的博客 875

运行catia_浅谈CATIA开发——CAA简介

一、背景CATIA是当今工业领域内领先的三维CAD软件,通过对CATIA的二次开发,可以对特定功能和需要进行定制,并且无缝嵌入到CAITA中。二、二次开发框架CATIA提供了AutomationAPI组件和组件应用架构(CAA,Component Application Architecture)两种开发模式。细分的话,其实可以分成四种:Automation API(自动化组件),Kon...

weixin_39592240的博客 4445

基于深度强化学习的柔性作业车间动态调度

在追求敏捷和灵活的生产调度方面,处理不可预测的动态事件的能力变得越来越重要。与此同时,生产系统中的网络-物理融合产生了大量需要实时挖掘和分析的工业数据。为了便于这种实时控制,本研究提出了一种分层分布式的体系结构来解决动态柔性作业车间调度问题。采用双深度Q网络算法(DDQN)训练调度智能体,捕捉生产信息与调度目标之间的关系,为具有恒定任务到达的柔性作业车间实时做出调度决策。为了处理动态调度中问题的可变规格说明,提出了专门的状态和动作表示法。此外,还提出了一种代理奖励整形技术(surrogate reward

太剧烈的快乐与太剧烈的悲哀是有相同之点的——同样地需要远离人群! 1万+
上一篇: 制作天正工具栏
下一篇: 做CAD二次開發一年多來的一些讀書筆記
Nancy_
博客等级 码龄16年 140粉丝 44原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值