QCAD 是一个免费、开源的计算机辅助绘图二维工具,功能强大。目前开源的二维CAD有QCAD、LibreCAD等,LibreCAD可以说是QCAD的分支版本。对比这两款开源软件,LibreCAD是纯C++开发,有boost库的依赖,源码比较重,而QCAD使用了Qt的Script模块(ECMAScript 5 - JavaScript 5),使用了C++和Javascript脚本两种开发方式。使用脚本来扩展功能比纯C++开发效率会高点,因为这些开源项目源码都很大,编译比较花时间。如果使用脚本来开发的话,没有编译时间,可以边写脚本边测试,很方便。
因为项目的需要,本人选择QCAD,并对其源码进行编译。本篇博文中,使用了VS2017+Qt5.12.5对QCAD v3.23.0.2版本的源码进行了成功的编译和运行。
一、环境准备
1、VS2017,Qt5.12.5/x86,Qt VS Tools插件
http://download.qt.io/official_releases/qt/
2、检查一下Windows环境变量是否正确:
设置Windows的环境变量。推荐使用工具Rapid Environment Editor。http://www.rapidee.com/
Path=F:\Qt\Qt5.12.5\5.12.5\msvc2017\bin
QTDIR=F:\Qt\Qt5.12.5\5.12.5\msvc2017
3、QCAD官网下载源码
https://www.qcad.org/en/ 官网域名1
https://www.ribbonsoft.com/en/ 官网域名2
https://qcad.org/en/dxflib-downloads dxflib库源码
https://www.ribbonsoft.com/en/dxflib-downloads dxflib库源码
https://github.com/qcad/qcad/tree/master/src/3rdparty/dxflib dxflib库源码
https://www.qcad.org/en/documentation/changelog 历次版本更新日志
https://github.com/qcad/qcad QCAD源码
https://www.ribbonsoft.com/doc/qcad/latest/developer/
4、解压源码包,确保以下文件夹存在(因为QCAD使用了Qt的Script模块,使用了C++和Javascript脚本两种开发方式。),若不存在则手动添加:
\QCAD\qcad-3.23.0.2\src\3rdparty\qt-labs-qtscriptgenerator-5.12.5
例如笔者的路径下原本就没有qt-labs-qtscriptgenerator-5.12.5,我把qt-labs-qtscriptgenerator-5.12.3拷贝为5.12.5,并且把qt-labs-qtscriptgenerator-5.12.3.pro文件名修改为qt-labs-qtscriptgenerator-5.12.5.pro
5、打开VS2017,主菜单->Qt VS Tools->打开qcad.pro文件,最后可能会提示出错(Import): Error(s): 23,没关系,不管它。
[15] - MAKEFILE_GENERATOR variable not set as a result of parsing : qcad-3.23.0.2.pro. Possibly qmake was not able to find files included using "include(..)" - enable qmake debugging to investigate more.
[16] - Project MESSAGE: ..\qcad-3.23.0.2
[17] - Project MESSAGE: ..\qcad-3.23.0.2.zip
[18] - Project MESSAGE: ..\qcad-3.vcxproj
[19] - Project MESSAGE: ..\qcad-3.vcxproj.filters
[20] - Project MESSAGE: ..\qcad-3.23.0.2
[21] - Project MESSAGE: ..\qcad-3.23.0.2.zip
[22] - Project MESSAGE: ..\qcad-3.vcxproj
[23] - Project MESSAGE: ..\qcad-3.vcxproj.filters
--- (Import): Error(s): 23
--- (qmake) : Exit Code: 3
二、编译qcadqt-labs-qtscriptgenerator-5插件(这个插件很重要,必须编译)
Qt脚本生成器是为Qt脚本生成Qt绑定的工具。 使用生成的绑定,您可以从Qt脚本中访问Qt API的大部分。 该插件源码来自:
https://github.com/shibukawa/qtscriptgenerator
https://github.com/sjinks/qtscriptgenerator
因为qcad与界面相关的功能都是用JavaScript脚本实现,所以需要编译Qt的脚本实现。找到源码的src目录中的3rdparty文件夹中与Qt版本对应的qt-labs-qtscriptgenerator,里面会已经生成了VS的解决方案。直接用VS打开解决方案,全部编译即可。
VS2017打开工程,编译:
\qcad-3.23.0.2\src\3rdparty\qt-labs-qtscriptgenerator-5.12.5\qcadqt-labs-qtscriptgenerator-5.sln
三、编译主程序
VS2017打开工程,编译:
\qcad-3.23.0.2\qcadqcad.sln
编译成功后,文件都会生成在指定的目录中,直接打开源码下面的debug文件中的qcad.exe即可以运行QCAD了。
四、常见问题解答
1、自己编译的debug或者release版本一运行自动退出了,怎么回事?
解决办法:需要编译qcadqt-labs-qtscriptgenerator-5插件就可以解决。编译的结果文件在路径:
\qcad-3.23.0.2\plugins\script\
注意:qcadqt-labs-qtscriptgenerator-5.sln不管是Debug还是Release的的编译结果的默认路径都是同一个,文件名也相同。这就比较麻烦了,编译完debug,再编译release的话,会把debug文件覆盖掉。这里请程序员注意一下。如果只是学习源码的话,release版本可暂不编译,只用debug版本即可了。
2、编译报错:error MSB6006: “cmd.exe”已退出,代码为 2
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(209,5): error MSB6006: “cmd.exe”已退出,代码为 2。
1>已完成生成项目“.vcxproj”的操作 - 失败。
解决办法:选择项目,右键点击“Convert project to Qt VS Tools project”,然后再次编译即可OK!
3、编译qcadcore和qcad时,报错:error LNK1104: 无法打开文件“\.obj”
工程-属性-链接器-输入-附加依赖项-lib的路径错乱了,如图:
修改为:
4、编译qcaddxf报错:
\qcad-3.23.0.2\src\io\dxf\rdxfimporter.cpp(130): error C2664: “bool DL_Dxf::in(std::istream &,DL_CreationInterface *)”: 无法将参数 1 从“std::ifstream”转换为“const std::string &”
解决办法:
#ifdef Q_OS_WIN
wchar_t* winfn = new wchar_t[2000];
int len = fileName.toWCharArray(winfn);
winfn[len] = '\0';
把 //bool success = dxflib.in(std::ifstream(winfn, std::ifstream::in), this);
替换为bool success = dxflib.in((const char*)fileName.toUtf8(), this);
5、编译qcadscripts报错:
4>qrc_scripts_release.obj : error LNK2005: "int __cdecl qInitResources_scripts(void)" (?qInitResources_scripts@@YAHXZ) 已经在 qrc_scripts.obj 中定义
4>qrc_scripts_release.obj : error LNK2005: "int __cdecl qCleanupResources_scripts(void)" (?qCleanupResources_scripts@@YAHXZ) 已经在 qrc_scripts.obj 中定义
4> 正在创建库 ..\..\plugins\\qcadscripts_debug.lib 和对象 ..\..\plugins\\qcadscripts_debug.exp
4>..\..\plugins\\qcadscripts_debug.dll : fatal error LNK1169: 找到一个或多个多重定义的符号
原因:不小心点击了菜单项Convert custom build steps to Qt/MSBuild
解决办法:重新打开qcad.pro文件,生成\qcad-3.23.0.2\src\scripts\qcadscripts.vcxproj.filters和qcadscripts.vcxproj文件。记住,千万不要再点击刚才提到的菜单项了。
6、QCAD所有的UI界面都是使用js实现的,入口是:\scripts\autostart.js
QCAD应用程序框架提供了CAD特定的功能,如CAD核心、DXF导出和导入、强大的图形视图等。ECMAScript文件将可用的功能组合到一个应用程序中。QCAD应用程序框架的ECMAScript接口可用于非常快速地构建和扩展CAD特定的应用程序。QCAD用户界面本身及其所有的交互工具以及大多数小部件和对话框都是通过ECMAScript接口实现的。每个QCAD包都附带的QCAD可执行文件本质上是一个脚本解释器,它具有标准的ECMAScript功能,此外还提供了Qt API和QCAD API的附加类。在一个独立的环境中运行QCAD可执行文件将不起任何作用,因为没有要执行的ECMAScripts。默认情况下,QCAD可执行文件通过查找一个名为“scripts/autostart.js”的文件开始执行。在QCAD中,自动启动脚本初始化了所有ECMAScript工具和用户界面组件并启动主应用程序循环。QCAD中当前可用的几乎所有小部件、菜单和工具都是在ECMAScript中实现的。这些脚本文件位于下载的QCAD软件包的“scripts”目录下。注意,在Mac OS X下,脚本目录位于“QCAD.app/ content/Resources/scripts”下的应用程序包中。
关于脚本的使用教程:https://www.qcad.org/en/tutorial-script-programming
7、QCAD的软件配置文件在:C:\Users\<用户名>\AppData\Roaming\QCAD\QCAD3.ini
8、如何在windows的dos环境下启动QCAD?
qcad.exe "C:\Users\firecat\Documents\dxf\555.dxf"
qcad.exe -exec scripts/File/OpenFile/OpenFile.js
9、依赖的Qt lib:
---Debug---
Qt5PrintSupportd.lib
Qt5Svgd.lib
Qt5OpenGLd.lib
Qt5Helpd.lib
Qt5UiToolsd.lib
Qt5Designerd.lib
Qt5Widgetsd.lib
Qt5Guid.lib
Qt5Scriptd.lib
Qt5ScriptToolsd.lib
Qt5Sqld.lib
Qt5XmlPatternsd.lib
Qt5Networkd.lib
Qt5Xmld.lib
Qt5Cored.lib
qtmaind.lib
---Release---
Qt5PrintSupport.lib
Qt5Svg.lib
Qt5OpenGL.lib
Qt5Help.lib
Qt5UiTools.lib
Qt5Designer.lib
Qt5Widgets.lib
Qt5Gui.lib
Qt5Script.lib
Qt5ScriptTools.lib
Qt5Sql.lib
Qt5XmlPatterns.lib
Qt5Network.lib
Qt5Xml.lib
Qt5Core.lib
qtmain.lib
---
相关学习资料:
https://www.cnblogs.com/opencascade/p/qcad.html
https://doc.qt.io/qt-5.12/qtscript-index.html Qt Script
https://doc.qt.io/qt-5.12/qscriptengine.html QScriptEngine
https://doc.qt.io/qt-5.12/qscriptenginedebugger.html Qt Script断点调试
ECMAScript
https://blog.csdn.net/tianyapai/article/category/8548350 QCad源码分析
https://blog.csdn.net/tianyapai/article/category/8500765 Qt Script翻译
QCAD与libreCAD的试用及比较,QCAD比libreCAD更好用,功能更强大