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-downloadsdxflib庫源碼
https://www.ribbonsoft.com/en/dxflib-downloads https://github.com/qcad/qcad/tree/master/src/3rdparty/dxflib https://www.qcad.org/en/documentation/changelog曆次版本更新日志
https://github.com/qcad/qcadQCAD源碼
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
三、編譯主程式
\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.htmlQt Script
https://doc.qt.io/qt-5.12/qscriptengine.htmlQScriptEngine
https://doc.qt.io/qt-5.12/qscriptenginedebugger.htmlQt Script斷點調試
ECMAScript
https://blog.csdn.net/tianyapai/article/category/8548350QCad源碼分析
https://blog.csdn.net/tianyapai/article/category/8500765Qt Script翻譯
QCAD與libreCAD的試用及比較,QCAD比libreCAD更好用,功能更強大