QGIS二次开发:集成二维CAD控件MxDraw

news2024/11/27 6:38:22

本文记录在QGIS中集成MxDraw控件的方法。

 一、安装MxDraw

参见笔者博文“FreeCAD二次开发:集成二维CAD控件MxDraw”所述的安装方法。

二、编译安装QGIS

参见笔者博文"Windows 10下编译安装QGIS"所述的编译安装方法。

二、集成方法

2.1 添加MxDrawView.ui文件

按照QGIS的管理,Qt ui文件可放到src/ui目录及其子目录下。因此,可将MxDrawView.ui拷贝到src/ui/gd目录下,并修改src/ui/CMakeLists.txt,

# ...

if (BUILD_GDGIS)
	file(GLOB GD_UIS "${CMAKE_CURRENT_SOURCE_DIR}/gd/*.ui")
endif()

if (BUILD_WITH_QT6)
  QT6_WRAP_UI(QGIS_UIS_H
    ${QGIS_UIS}
    ${SYMBOLLAYER_UIS}
    ${EDITORWIDGET_UIS}
    ${PAINTEFFECT_UIS}
    ${PROCESSING_UIS}
    ${AUTH_UIS}
    ${RASTER_UIS}
    ${STYLEDOCK_UIS}
    ${LAYOUT_UIS}
    ${MESH_UIS}
    ${POINTCLOUD_UIS}
    ${_3D_UIS}
    ${CALLOUT_UIS}
    ${LABELING_UIS}
    ${NUMERICFORMAT_UIS}
    ${ATTRIBUTEFORMCONFIG_UIS}
    ${GEOREFERENCER_UIS}
    ${ANNOTATION_UIS}
    ${SENSOR_UIS}
	${GD_UIS}
  )
else()
  QT5_WRAP_UI(QGIS_UIS_H
    ${QGIS_UIS}
    ${SYMBOLLAYER_UIS}
    ${EDITORWIDGET_UIS}
    ${PAINTEFFECT_UIS}
    ${PROCESSING_UIS}
    ${AUTH_UIS}
    ${RASTER_UIS}
    ${STYLEDOCK_UIS}
    ${LAYOUT_UIS}
    ${MESH_UIS}
    ${POINTCLOUD_UIS}
    ${_3D_UIS}
    ${CALLOUT_UIS}
    ${LABELING_UIS}
    ${NUMERICFORMAT_UIS}
    ${ATTRIBUTEFORMCONFIG_UIS}
    ${GEOREFERENCER_UIS}
    ${ANNOTATION_UIS}
    ${SENSOR_UIS}
	${GD_UIS}
  )
endif()

# ...

2.2 添加MxDrawView类

界面相关的代码放到src/gui目录下,将MxDrawView.h、MxDrawView.cpp拷贝到src/gui/gd目录下,并修改CMakeLists.txt文件

# ...

# sources for GDGIS
if (BUILD_GDGIS)

  set(GD_HDR_FILES
		gd/MxDrawview.h
	)

  set(GD_SRC_FILES
    gd/MxDrawview.cpp
  )

	SOURCE_GROUP("gd" FILES ${GD_HDR_FILES} ${GD_SRC_FILES})

  set(QGIS_GUI_HDRS
    ${QGIS_GUI_HDRS}
    ${GD_HDR_FILES}
  )

  set(QGIS_GUI_SRCS
    ${QGIS_GUI_SRCS}
    ${GD_SRC_FILES}
  )

endif()

# ...

# Link AxBase,AxContainer for GDGIS
if (BUILD_GDGIS)
  find_package(${QT_VERSION_BASE} COMPONENTS AxBase AxContainer REQUIRED)
  target_link_libraries(qgis_gui
    ${QT_VERSION_BASE}::AxBase
    ${QT_VERSION_BASE}::AxContainer
  )
endif()

2.3 实现MxDrawView类

仿照MxDrwa自带例子TestQtMxDraw,实现MxDrawView

#ifndef gd_MxDrawView_H
#define gd_MxDrawView_H

#include "qgis_gui.h"
#include <QMainWindow>

namespace gd
{
    class Ui_MxDrawView;

    class GUI_EXPORT MxDrawView : public QMainWindow
    {
        Q_OBJECT

    public:
        MxDrawView(QWidget* parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
        ~MxDrawView();

    protected Q_SLOTS:

    private slots:
        void on_pushButton_clicked();

        void on_axWidget_ImplementCommandEvent(int iCommandId);

    protected:
        Ui_MxDrawView* ui;

    };
} // namespace gd

#endif // gd_MxDrawView_H
#include "MxDrawView.h"
#include "ui_MxDrawView.h"

using namespace gd;

MxDrawView::MxDrawView(QWidget* parent, Qt::WindowFlags flags)
	: QMainWindow(parent, flags),
	ui(new Ui_MxDrawView)
{
	// Set up ui
	ui->setupUi(this);
	connect(ui->axWidget, SIGNAL(ImplementCommandEvent(int)), this, SLOT(on_axWidget_ImplementCommandEvent(int)));
}

MxDrawView::~MxDrawView()
{
}
void MxDrawView::on_pushButton_clicked()
{
	// 执行控件自定义命令函数,命令的id为2,这个id用户可以自己取任意数,可以理解为是给执行的命令一个编号.
	ui->axWidget->dynamicCall("DoCommand(const qint32&)", 2);
}

void MxDrawView::on_axWidget_ImplementCommandEvent(int iCommandId)
{

	if (iCommandId == 2)
	{
		// 调用控件打开函数,打开H:盘的1.dwg文件。
		std::string filename = "H:\\1.dwg";
		//ui->axWidget->dynamicCall("OpenDwgFile(const QString&)", "H:\\1.dwg");
		ui->axWidget->dynamicCall("OpenDwgFile(const QString&)", QString::fromUtf8(filename.c_str()));
	}

2.4 嵌入MxDrawView窗体

修改src/app/qgisapp.cpp,创建并嵌入MxFrawView窗体,

QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, bool skipBadLayers, bool skipVersionCheck, const QString &rootProfileLocation, const QString &activeProfile, QWidget *parent, Qt::WindowFlags fl )
  : QMainWindow( parent, fl )
  , mSplash( splash )
{
//...
  mCentralContainer = new QStackedWidget;
  mCentralContainer->insertWidget(0, mMapCanvas);

#ifdef GDGIS
  QTabWidget* tabWidget = new QTabWidget;
  tabWidget->addTab(mCentralContainer, "Map");
  tabWidget->addTab(new gd::MxDrawView(), "CAD");
  centralLayout->addWidget(tabWidget, 0, 0, 2, 1);
#else
  mCentralContainer->insertWidget(1, mWelcomePage);
  centralLayout->addWidget(mCentralContainer, 0, 0, 2, 1);
#endif 

  mInfoBar->raise();
//...
}

网络资料

 FreeCAD二次开发:集成二维CAD控件MxDrawhttps://blog.csdn.net/qq_26221775/article/details/121192465?spm=1001.2014.3001.5502

Windows 10下编译安装QGIShttps://blog.csdn.net/qq_26221775/article/details/122792445?spm=1001.2014.3001.5502MxDrawhttps://www.mxdraw.com/

QGIShttps://www.qgis.org/en/site/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/778207.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA主流压缩解压工具对比、用法与选取

一、JAVA主流压缩工具 java.util.zip&#xff1a; **说明&#xff1a;**Java标准库提供的压缩与解压功能&#xff0c;包含在java.util.zip包中。通过ZipInputStream和ZipOutputStream可以实现ZIP格式的压缩与解压缩操作。 适用场景&#xff1a; 适合简单的ZIP格式压缩与解压缩操…

FFMPEG android mac 编译 支持DASH/OPENSSL问题汇总

一 下载源码 FFMPEG https://github.com/FFmpeg/FFmpeg/tree/release/4.3 二 编写脚本 支持https 就必须添加open SSL 的编译 具体可以查看我的另一个关于open SSL 的 然后我们配置的一些路径 涉及 ndk 的一定要查看你用的ndk 版本 是否存在这些路径这是第一步 然后如果支…

按照Vue写WPF(1):属性绑定

文章目录 前言代码实现效果代码逻辑 总结 前言 作为一个使用Vue非常熟练的C#全干工程师。当我在接触WPF的时候&#xff0c;我就一直想用Vue的想法去重写WPF框架。经过一个星期的琢磨&#xff0c;终于琢磨出来了如何优雅的入参。期间看了上百篇博客&#xff0c;浏览了一堆的视频…

如何把打包的vue项目放到flask中:Flask init参数详解

参数列表 import_name: the name of the application package&#xff0c;感觉没什么用static_url_path: can be used to specify a different path for the static files on the web. Defaults to the name of the static_folder folder。描述静态文件&#xff08;css&#x…

vue3-Api和数据响应式的变化

问题1&#xff1a;为什么vue3中去掉了vue构造函数&#xff1f; 问题2&#xff1a;谈谈你对vue3数据响应式的理解 去掉了Vue构造函数 在过去&#xff0c;如果遇到一个页面有多个vue应用时&#xff0c;往往会遇到一些问题 <!-- vue2 --> <div id"app1">&…

sketch如何在线打开?有没有什么软件可以辅助

Sketch 在线打开的方法有哪些&#xff1f;这个问题和我之前回答过的「Sketch 可以在线编辑吗&#xff1f;」是一样的答案&#xff0c;没有。很遗憾&#xff0c;Sketch 没有在线打开的方法&#xff0c;Sketch 也做不到可以在线编辑。那么&#xff0c;那些广告里出现的设计软件工…

基于Java+SpringBoot+vue前后端分离网上购物商城系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

【高阶数据结构】B树

文章目录 一、B-树1. 常见的搜索结构2. B树概念3. B-树的查找4. B-树的插入分析 二、B树和B*树1. B树2. B*树 三、B-树的应用1. 索引2. MySQL索引简介2.1 MyISAM2.2 InnoDB 一、B-树 1. 常见的搜索结构 种类数据格式时间复杂度顺序查找无要求O(N)二分查找有序O(log2N)二叉搜索…

体验文心千帆:开启智能大模型时代的新征程

目录 前言文心千帆的申请和使用感受1.1 注册流程简单1.2 试用初体验 二、文心千帆大模型平台功能介绍2.1 强大的对话式语言模型2.2 丰富的应用场景 三、如何使用 API3.1 API 列表ERNIE-BotERNIE-Bot-turboBLOOMZ-7BEmbedding-V1Prompt模板 3.2 API 调用基本流程3.2.1 创建智能云…

如何在armv6 armv7 armv8(aarch64)嵌入式板子上面安装nginx服务器,支持H265码流

如何在armv6 armv6 armv8 aarch64 嵌入式板子上面安装nginx服务器支持推送H265的视频流 开始吧 一&#xff0c;准备工作二&#xff0c;configure时遇到的出错问题1、checking for C compiler … found but is not working2&#xff0c;error: can not detect int size3&#xf…

【python】使用difflib对比json差异

之前自己使用python写了方法进行对比json数据&#xff0c;这次使用difflib模块实现&#xff1a; 一个json数据存在text1.txt&#xff1a; 另一个json数据存在text2.txt&#xff1a; 1、导入difflib模块 import difflib 2、调用difflib中的HtmlDiff类&#xff0c;使用make_fi…

ShardingSphere分库分表实战之广播表

&#x1f680; ShardingSphere &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&…

多个springmvc项目共用同一个redis导致session冲突的问题 的解决方案

由于redis来做session的统一管理插件&#xff0c;如果多个项目使用同一个redis来管理session的话&#xff0c;那么session很有可能会出现冲突。 下图&#xff1a;默认session在redis中的key值是spring:session:sessions:sessionId&#xff0c;如果多个项目中出现了相同的sessi…

网络安全(黑客)自学的一些建议

1.选择方向 首先是选择方向的问题&#xff0c;网络安全是一个很宽泛的专业&#xff0c;包含的方向特别多。比如 web安全&#xff0c;系统安全&#xff0c;无线安全 &#xff0c;二进制安全&#xff0c;运维安全&#xff0c;渗透测试&#xff0c;软件安全&#xff0c;IOT安全&a…

docker-compose搭建RocketMq集群

集群架构&#xff1a;双主 机器&#xff1a;172.50.2.41 172.50.2.42 一、创建目录 mkdir -p /docker/alibaba/rocketmq/logs/nameserver mkdir -p /docker/alibaba/rocketmq/logs/broker mkdir -p /docker/alibaba/rocketmq/store/broker mkdir -p /docker/alibaba/rocket…

通过Appium和Accessibility Inspector获取iOS应用元素定位的方法

在 iOS 移动应用程序上使用选择器查找元素定位是我们在移动端 UI 自动化测试的先决条件。 但是&#xff0c;由于应用程序内容在原生 iOS 应用程序中的呈现方式&#xff0c;我们可以用来定位应用程序元素的选择器与 Web 浏览器元素有很大不同。 在本文中&#xff0c;我们将了解 …

Spring Boot 日志文件有什么用

目录 一、自定义打印日志 1.1 日志框架说明 1.2 实现自定义打印日志 1.3 日志的格式说明 2.1 日志的级别 2.2 设置日志级别的作用&#xff1a; 2.3 如何设置日志的级别 二、 日志的持久化 3.1 设置日志保存路径 &#xff08;在 .yml 配置文件中设置日志保存路径&…

一、二维前缀和算法

文章目录 前缀和模板724. 寻找数组的中心下标238. 除自身以外数组的乘积560. 和为 K 的子数组974. 和可被 K 整除的子数组525. 连续数组1314. 矩阵区域和 前缀和模板 一维前缀和&#xff1a; import java.util.*;public class Main {public static void main(String[] args) …

docker-compose启动minio

一、创建文件夹 mkdir -p /docker/stand-alone-minio/data mkdir -p /docker/stand-alone-minio/configchmod 777 -R /docker/stand-alone-minio/data chmod 777 -R /docker/stand-alone-minio/config 二、docker-compose.yml version: 3.9services:minio:image: minio/mini…