CAD开发中遇到的问题

此处记录本人在做CAD项目中遇到的问题,并不适合所有人,只是为了重新遇到问题快速回顾,其他人仅供参考。

环境与开发库

ObjectArx 

CGAL-3.7 

boost_1_61_0 

Xtreme ToolkitPro v15 

ArcGIS10.2

 

问题1 CGAL环境,fatal error C1189: #error :  "Incompatible build options"

#if defined(__MSVC_RUNTIME_CHECKS) && !defined(_DEBUG)
#  pragma message("Using the /RTC option without specifying a debug runtime will lead to linker errors")
#  pragma message("Hint: go to the code generation options and switch to one of the debugging runtimes")
#  error "Incompatible build options"
#endif

在 Visual Studio 开发环境中设置此编译器选项

打开项目的“属性页”对话框。 

单击“C/C++”文件夹。

单击“代码生成”属性页。

修改下列属性之一或两者都修改:“基本运行时检查”或“较小类型检查”

 

问题2 重新编译 opennurbs.lib 的时候还要引用这个 Rpcrt4.lib

 

问题3 32位迁移64位 兼容性问题

报错信息:

error C2440: “static_cast”: 无法从“void (__cdecl CGridCtrl::* )(UINT)”转换为“void (__cdecl CWnd::* )(UINT_PTR)”

error C2664: “SetTimer”: 不能将参数 4 从“void (__cdecl *)(HWND,UINT,UINT,DWORD)”转换为“TIMERPROC”

解决:

#ifdef _WIN64
void CALLBACK OnTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
#else
void CALLBACK OnTimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
#endif

#ifdef _WIN64
    afx_msg void OnTimer(UINT_PTR nIDEvent);
    afx_msg LRESULT OnChangePrjProp(WPARAM wParam, LPARAM lParam);
    afx_msg LRESULT OnChangeSelectEnt(WPARAM wParam, LPARAM lParam);
    LRESULT OnParentClose(WPARAM wParam, LPARAM lParam);
#else
    afx_msg void OnTimer(UINT nIDEvent);
    afx_msg long OnChangePrjProp(WPARAM wParam, LPARAM lParam);
    afx_msg long OnChangeSelectEnt(WPARAM wParam, LPARAM lParam);
    long OnParentClose(WPARAM wParam, LPARAM lParam);
#endif

问题4 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)

问题5 LINK : fatal error LNK1104: 无法打开文件“CGAL-vc100-mt-gd.lib”

使用源码重新生成lib文件,或者把现有的CGAL-vc100-mt.lib直接改名试试

问题6 Error LNK2001 无法解析的外部符号

1 查找外部符号头文件是否已经#include

2 找出所属lib看看是否已经被导入

3 查看lib源码看看方法是否已经导出

4 查看外部符号是否在本项目内,已经被包含进工程里面

 

问题7 精度问题

 

闭合多段线与射线使用intersectWith 会取出来两个交点,发生的问题是CAD精度导致,有两个解决方法:

1 是取出交点后,重新用getClosestPointTo判断交点是否在实体上。

2 把实体移动到原地附近再做处理

 

问题7 编译错误

错误描述: acax17enu.tlh(613) : error C2371: 'LONG_PTR' : redefinition; different basic types see declaration of 'LONG_PTR'

解决:

#import "acax17enu.tlb" raw_interfaces_only no_namespace // VS2005 - VC8、CAD2007

改为
#import "acax18enu.tlb" raw_interfaces_only no_namespace // VS2005 - VC8、CAD2007

 

问题8 ADO调用

在CAD使用ADO的方式输出Excel,会存在版本不匹配的问题。例如:CAD 2008中调用Office 2010 x64,会在Open函数中直接跳出异常。可以考虑使用COM的方式,未实测。

_ConnectionPtr exclConn;
CString connStr;

exclConn.CreateInstance(__uuidof(Connection));

connStr.Format(_T("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s;Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=0\""),pFile);
exclConn->Open(connStr.GetBuffer(),_T(""),_T(""),adModeUnknown);

问题9  fatal error C1900: Il mismatch between 'P1' version '20060201' and 'P2' version '20050411'

一般是引用了高版本编译器生成的LIB导致

1 升级当前编译器版本,例如安装SP1

2 用当前版本编译器重新编译LIB

问题10 error C2872: 'CCriticalSection' : ambiguous symbol

could be afxmt.h(150) : CCriticalSection' or atlsync.h(31) : ATL::CCriticalSection'

解决:在使用到CCriticalSection的地方,加入以下这段

#include <afxmt.h>
typedef CCriticalSection AfxmtCriticalSection;
typedef CEvent AfxmtEvent;
#include <atlsync.h>

问题11 使用ADO操作Excel时候,关闭_RecordsetPtr 报错

try
{
m_pRecordset->State&adStateOpen;
m_pRecordset->AddNew();
m_pRecordset->PutCollect("old",_variant_t((long)28);
……
m_pRecordset->GetFields()->GetItem("data")->AppendChunk(varBLOB);
m_pRecordset->Update(); //语句A ,这很重要 就是因为没有Update导致 Close报错
}
catch (_com_error e)
{
m_pRecordset->Close(); //语句B
……
}

问题12 WPS OFFICE 冲突,error C4772: #import referenced a type from a missing type library; '__missing_type__'

解决方法转自 https://blog.csdn.net/godoooo/article/details/84591520

Win + R运行命令:regedit ; 在弹出的注册表编辑器中找到如下选项:
HKEY_CLASSES_ROOT\TypeLib{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}\2.5
右边会显示选择的项的信息,右键 --> 删除多余的即可。

问题13 fatal error C1084: Cannot read type library file: 'C:\\Program Files (x86)\\Microsoft Office\\Office14\\EXCEL.EXE': 加载类型库/DLL 时出错。

原因,本身机器Win7 64位系统安装的是x86的office2010,卸载后,陆续装了WPS,与office2010精简版,导致了开发环境出现各种问题,首先我4个版本的VS05,08,10,13的许可都被清空掉了,10跟13可以重新注册,05和08经过修复,重装都一直报各种错误,最后使用Windows install Clean Up 把05跟08的组件都卸载掉才重新安装成功,编译以前正常的代码缺又出现上面的错误。查了很久才确定是TypeLib的注册表被修改过,通过 Microsoft Office 14.0 Object Library关键字搜到了HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}这个注册表,然后仿照Office07的内容重新注册,内容如下

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}\2.5]
@="Microsoft Office 14.0 Object Library"
"PrimaryInteropAssemblyName"="Office, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C"

[HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}\2.5\0]

[HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}\2.5\0\win32]
@="C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\OFFICE14\\MSO.DLL"

[HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}\2.5\FLAGS]
@="0"
至此,问题解决。

问题14 fatal error C1083: Cannot open include file: 'type_traits': No such file or directory

解决方法:需要给vs2008打个sp1的补丁

问题:fatal error C1083: 无法打开包括文件:“AcTc_i.h”: No such file or directory

解决方法:没有包含ObjectARX 2010\inc-win32目录

问题15 fatal error C1083: 无法打开包括文件:“atlsoap.h”: No such file or directory

解决方法:替换VC2008 安装目录的 include文件夹

ATL_Server_Source_and_Headers_9_0_70425_Alpha.zip 解压到

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc

问题16 试图执行系统不支持的操作
  

 解决方法:

    CAcModuleResourceOverride res; //(添加此行)
    AcAxDocLock lock;
    acedGetAcadFrame()->SetFocus();//切换焦点 
    DlgSplitZD dlg;
    dlg.DoModal();

问题17 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

将Microsoft Visual Studio 10.0\VC\bin中的cvtres.exe直接删除或改名。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CAD二次开发是指在现有的CAD软件基础上进行定制化开发,以满足特定需求。这种开发需要参考CAD开发文档,文档包含了开发所需的API接口、函数库、参数说明以及使用示例等信息。在进行CAD二次开发时,开发人员可以根据文档提供的接口和函数,编写相应的程序代码,实现特定功能。 CAD开发文档对于开发人员来说非常重要。首先,它提供了接口和函数的详细说明,可以帮助开发人员快速了解CAD软件的内部结构和工作原理。通过文档,开发人员可以了解到CAD软件提供了哪些功能和对象,以及如何使用它们。其次,文档还包含了一些开发技巧和注意事项,帮助开发人员更好地进行开发工作。文档还提供了一些示例代码,可以直接使用或修改,加快开发进度。 在进行CAD二次开发时,开发人员应该充分利用CAD开发文档。首先,仔细阅读文档,了解CAD软件的架构和相关概念。然后,根据自己的需求,在文档查找相关的接口和函数,了解其使用方法和参数含义。在编写代码时,可以参考文档提供的示例,或者参考文档的代码片段。开发过程,如果遇到问题,可以再次回到文档查找答案。 总而言之,CAD开发文档是进行CAD二次开发的重要参考资料,开发人员应该根据文档提供的信息和示例进行开发工作,并在遇到问题时及时回到文档寻找解决方案。这样可以更加高效地进行CAD二次开发,并实现自己的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值