FreeCAD二次开发实战:如何用MxDraw控件打造专属CAD工具(含避坑指南)

FreeCAD二次开发:集成二维CAD控件MxDraw 济南友泉软件有限公司 FreeCAD是一套基于OpenCASCADE/QT的三维全参数化建模开源代码,虽然提供了Draft、TechDraw等二维绘图功能,但是其二维建模能力比较弱。因此,需要研究借助于(非)商业软件包来强化FreeCAD的二维建模功能。 Ref. from FreeCAD TechDraw----------------------------------------------------------------------------------------------- If 阅读详情

FreeCAD二次开发实战:如何用MxDraw控件打造专属CAD工具(含避坑指南)

如果你是一位C++或Qt开发者,正在为FreeCAD强大的三维参数化建模能力所吸引,却又苦于其原生二维绘图功能在某些专业场景下不够“趁手”,那么这篇文章正是为你准备的。FreeCAD作为一个开源的三维CAD/CAE/CAM平台,其模块化架构和开放的源码为深度定制提供了无限可能。然而,当项目需求聚焦于复杂的二维图纸绘制、批注或与特定DWG格式深度交互时,仅依赖Draft或TechDraw工作台可能会感到掣肘。这时,引入一个成熟、专业的二维CAD控件,将其无缝集成到FreeCAD的生态中,就成了一条高效且实用的技术路径。本文将聚焦于如何将梦想CAD的MxDraw控件深度整合进FreeCAD,从架构理解、代码实战到开发中那些容易踩坑的细节,手把手带你打造一个功能强大的专属CAD工具。我们的目标读者是希望扩展FreeCAD功能、具备一定C++/Qt基础的开发者,整个过程更像是一次对FreeCAD插件系统与外部ActiveX控件交互的深度探索。

1. 理解FreeCAD的文档/视图架构与集成策略

在动手写代码之前,我们必须先吃透FreeCAD的核心架构思想。FreeCAD采用了经典的文档-视图(Document-View)模型,这是其模块化与可扩展性的基石。简单来说,App::Document负责管理所有的数据对象(App::DocumentObject),而Gui::ViewProvider则负责将这些数据对象以可视化的方式呈现出来。每一个视图(Gui::MDIView)都关联着一个文档,为用户提供交互界面。

当我们计划集成MxDraw这样的外部控件时,核心挑战在于:如何让一个“外来”的ActiveX控件,表现得像一个原生的FreeCAD功能模块? 这要求我们创建一套符合FreeCAD规范的新对象类型。

  • 文档对象(App::DocumentObject):它代表MxDraw图纸数据在FreeCAD内部的存在。虽然MxDraw可能使用自己的二进制格式存储图形数据,但我们需要一个“壳”来承载它,管理其属性(如文件路径、版本、作者等),并建立与其他FreeCAD对象(如三维零件、草图)的关联关系。
  • 视图提供者(Gui::ViewProvider):它的职责是告诉FreeCAD如何显示和与这个文档对象交互。当用户双击一个MxDraw对象时,视图提供者需要创建并返回一个自定义的视图窗口(Gui::MDIView的子类),这个窗口内部将嵌入MxDraw控件。
  • 自定义视图(Gui::MDIView):这是用户实际进行二维绘图操作的界面。我们将在这里实例化Qt的QAxWidget来承载MxDraw的ActiveX控件,并处理所有与绘图相关的用户交互事件。

这种分层设计确保了数据与界面的分离,也使得我们的MxDraw功能能够自然地融入FreeCAD的多文档界面(MDI)、撤销/重做、对象树等核心机制中。理解这一点,是后续所有开发工作的前提。

2. 环境准备与MxDraw控件的初步验证

在开始FreeCAD侧的编码前,确保你的开发环境与MxDraw控件本身是正常工作的,这能避免很多后续的混淆和错误。

2.1 开发环境搭建

首先,你需要一个完整的FreeCAD开发环境。这通常意味着:

  1. 从GitHub克隆FreeCAD的源代码。
  2. 安装所有必要的依赖库,如OpenCASCADE、Qt、Python等。
  3. 使用CMake配置并生成适用于你IDE(如Visual Studio, Qt Creator)的工程文件。
  4. 成功编译出FreeCAD的可执行文件。

提示:建议在编译FreeCAD时启用BUILD_QT5或BUILD_QT6选项,并确保与后续MxDraw控件使用的Qt版本一致,避免潜在的运行时库冲突。

2.2 MxDraw控件的安装与测试

从梦想CAD官网获取MxDraw 5.2的开发试用包(例如MxDraw5.2TryVersion.exe)。这个包实际上是一个自解压压缩文件。

  1. 安装控件:运行解压后的安装程序(如MxDrawx64Setup(xxxxxx).exe)。这个过程不仅会将文件复制到C:\Program Files\Mxkd\MxDrawx64这样的目录,更重要的是会在系统中注册MxDrawX.ocx这个ActiveX控件。
  2. 关键验证:安装后,务必进行测试。进入开发包的Samples目录,找到TestQtMxDraw这个示例工程。用Qt Creator或Visual Studio打开它,尝试编译并运行。
// 这是一个类似TestQtMxDraw示例中的关键代码片段,用于验证控件能否创建
#include <QAxWidget>
#include <QApplication>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    QAxWidget *axWidget = new QAxWidget();
    // 尝试创建MxDraw控件
    if (!axWidget->setControl("{MxDrawXCtrl.5.2}")) { // CLSID可能因版本而异
        qDebug() << "Failed to load MxDraw control!";
        return -1;
    }
    axWidget->show();
    return a.exec();
}

如果这个示例程序能成功运行,并显示出一个空的CAD绘图区域,恭喜你,MxDraw控件本身在你的系统上工作正常。这个步骤至关重要,它能将问题范围锁定在FreeCAD集成层面,而非控件本身。

3. 创建FreeCAD自定义模块:文档与视图的绑定

现在,我们进入核心开发阶段,在FreeCAD中创建一个新的工作台(Workbench)或模块来承载我们的MxDraw功能。

3.1 定义MxDraw文档对象

首先,创建继承自App::DocumentObject的类。这个类本身可能不存储复杂的图形数据,而是作为一个“代理”或“引用”。

// 文件:MxDrawObject.h
#include <App/DocumentObject.h>
#include <App/PropertyStandard.h>

namespace MyMxDrawModule {

class MxDrawObject : public App::DocumentObject {
    PROPERTY_HEADER(MyMxDrawModule::MxDrawObject); // 宏定义,用于属性系统

public:
    MxDrawObject();
    virtual ~MxDrawObject();

    // 定义一些属性,例如关联的DWG文件路径
    App::PropertyString FilePath;

    // 必须重写的方法:返回负责显示此对象的视图提供者类名
    virtual const char* getViewProviderName(void) const override {
        return "MyMxDrawModuleGui::ViewProviderMxDraw";
    }

    // 其他必要的方法,如序列化
    virtual short mustExecute(void) const override;
    virtual App::DocumentObjectExecReturn *execute(void) override;
};
}

在对应的.cpp文件中,你需要初始化属性并实现相关方法。这个对象会被添加到FreeCAD的文档对象树中。

3.2 实现视图提供者(ViewProvider)

视图提供者是连接数据对象和用户界面的桥梁。它的关键任务是创建自定义的视图窗口。

// 文件:ViewProviderMxDraw.h
#include <Gui/ViewProviderDocumentObject.h>
#include <QPointer>

namespace MyMxDrawModuleGui {

class MxDrawView; // 前向声明,我们稍后定义这个自定义视图类

class ViewProviderMxDraw : public Gui::ViewProviderDocumentObject {
    PROPERTY_HEADER_WITH_OVERRIDE(MyMxDrawModuleGui::ViewProviderMxDraw);

public:
    ViewProviderMxDraw();
    ~ViewProviderMxDraw();

    // 重写:当对象在3D视图或其他地方被双击时调用
    virtual bool doubleClicked(void) override;
    
    // 重写:返回该对象对应的MDI视图,这是集成关键!
    virtual Gui::MDIView* getMDIView(void) override;

    // 重写:提供对象在树形视图中的图标
    virtual QIcon getIcon(void) const override;

    // 设置显示模式(对于2D控件,可能只有一种模式)
    void setDisplayMode(const char* ModeName) override;

private:
    // 用于创建和管理MxDrawView的私有函数
    MxDrawView* showMxDrawView();
    
    // 使用QPointer智能管理Qt对象生命周期,防止野指针
    QPointer<MxDrawView> m_view;
};
}

getMDIView()方法是核心。当FreeCAD需要显示这个对象时(例如用户双击它),就会调用此方法。我们的实现是返回一个MxDrawView的实例。

4. 构建自定义视图窗口:嵌入MxDraw控件

这是最具“实战”味道的部分。我们需要创建一个Gui::MDIView的子类,并在其中通过Qt的QAxWidget来宿主MxDraw ActiveX控件。

4.1 创建MxDrawView类

首先,利用Qt Designer设计一个简单的UI界面(.ui文件),主要包含一个QAxWidget区域和一些必要的工具栏按钮(如打开、保存、画线、画圆)。然后生成对应的UI头文件。

// 文件:MxDrawView.h
#include <Gui/MDIView.h>
#include <ui_MxDrawView.h> // Qt Designer生成的文件

namespace MyMxDrawModuleGui {

class MxDrawView : public Gui::MDIView, private Ui::MxDrawView {
    Q_OBJECT
    TYPESYSTEM_HEADER(); // FreeCAD类型系统宏

public:
    MxDrawView(Gui::Document* pcDocument, App::DocumentObject* docObj, QWidget* parent = nullptr);
    ~MxDrawView();

protected Q_SLOTS:
    // 响应UI按钮的槽函数
    void onOpenDwgButtonClicked();
    void onSaveButtonClicked();
    void onLineCommandButtonClicked();
    
    // 响应MxDraw控件事件的槽函数
    void onMxDrawCommandEvent(int iCommandId);

private:
    // 初始化MxDraw控件
    bool initializeMxDrawControl();
    
    // 关联的文档对象(即我们之前定义的MxDrawObject)
    App::DocumentObject* m_docObject;
};

}

4.2 初始化与嵌入控件

在MxDrawView的构造函数和初始化函数中,完成控件的嵌入。

// 文件:MxDrawView.cpp
#include "MxDrawView.h"
#include <QAxWidget>
#include <ActiveQt/QAxBase>

MxDrawView::MxDrawView(Gui::Document* doc, App::DocumentObject* obj, QWidget* parent)
    : Gui::MDIView(doc, parent), m_docObject(obj) {
    // 设置UI
    setupUi(this); // 来自Ui::MxDrawView
    
    // 尝试将MxDraw控件设置为axWidget(在UI设计器中放置的QAxWidget对象)
    if (!initializeMxDrawControl()) {
        // 初始化失败处理,例如显示错误标签
        qWarning() << "Failed to initialize MxDraw control in FreeCAD view.";
    }
    
    // 连接信号与槽
    connect(openButton, &QPushButton::clicked, this, &MxDrawView::onOpenDwgButtonClicked);
    // ... 连接其他按钮
}

bool MxDrawView::initializeMxDrawControl() {
    // axWidget 是UI文件中QAxWidget的对象名
    if (!axWidget) {
        return false;
    }
    
    // 设置要承载的ActiveX控件的CLSID或ProgID
    // 这个ID需要从MxDraw的文档或注册表中获取
    QString controlId = "{MxDrawXCtrl.5.2}"; // 示例ID,请以实际为准
    bool ok = axWidget->setControl(controlId);
    
    if (ok) {
        // 连接MxDraw控件发出的事件
        QObject::connect(axWidget, SIGNAL(ImplementCommandEvent(int)),
                         this, SLOT(onMxDrawCommandEvent(int)));
        // 可以进一步初始化控件属性,如背景色、网格等
        // axWidget->dynamicCall("SetBackgroundColor(int)", 0xFFFFFF);
        return true;
    } else {
        qDebug() << "QAxWidget setControl failed. Error:" << axWidget->control();
        return false;
    }
}

4.3 实现基本绘图交互

通过QAxWidget::dynamicCall(),我们可以调用MxDraw控件暴露的COM方法。

void MxDrawView::onOpenDwgButtonClicked() {
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open DWG File"), "", tr("DWG Files (*.dwg)"));
    if (!fileName.isEmpty()) {
        // 通过COM接口调用MxDraw的打开文件方法
        QAxBase* axBase = axWidget->querySubObject("GetMxDraw");
        if (axBase) {
            QVariant ret = axBase->dynamicCall("OpenDwgFile(const QString&)", fileName);
            if (ret.toBool()) {
                // 成功打开,可以更新关联的MxDrawObject的FilePath属性
                // static_cast<MxDrawObject*>(m_docObject)->FilePath.setValue(fileName.toStdString().c_str());
            }
        }
    }
}

void MxDrawView::onLineCommandButtonClicked() {
    // 发送画线命令到MxDraw控件
    QAxBase* axBase = axWidget->querySubObject("GetMxDraw");
    if (axBase) {
        axBase->dynamicCall("SendStringToExecute(const QString&)", QString("_LINE"));
    }
}

5. 避坑指南与高级集成技巧

在实际集成过程中,你会遇到一些预料之外的问题。以下是一些常见的“坑”及其解决方案。

5.1 运行时依赖与部署

  • 问题:在开发机上运行良好,但发布给用户后,程序崩溃或无法加载MxDraw控件。
  • 排查:
    1. OCX注册:确保目标机器上已正确注册MxDrawX.ocx。你的安装程序需要以管理员权限执行注册(regsvr32 MxDrawX.ocx)。
    2. VC++运行时库:MxDraw控件可能依赖于特定版本的Visual C++ Redistributable。在安装包中一并包含并安装它们。
    3. Qt插件:如果你的FreeCAD是动态链接Qt的,确保qaxcontainer.dll(提供QAxWidget支持)随程序一起发布,并位于正确的目录(通常是可执行文件同级目录下的plugins/activeqt文件夹)。
  • 建议:创建一个详细的部署清单,并使用像windeployqt这样的工具来帮助收集Qt依赖。

5.2 线程与事件循环冲突

  • 问题:在操作MxDraw控件时,FreeCAD界面无响应或出现奇怪的重绘问题。
  • 原因:ActiveX控件通常有自己的消息循环,可能与Qt的事件循环产生微妙的冲突。一些耗时的CAD操作(如打开超大DWG文件)如果阻塞了主线程,就会导致界面卡死。
  • 解决方案:
    • 将耗时的MxDraw操作(如复杂文件加载、批量处理)放入单独的QThread中执行。
    • 使用QApplication::processEvents()在长时间操作中适时处理事件,保持界面响应,但需谨慎使用,避免递归调用。
    • 确保所有对QAxWidget及其子对象的方法调用都在主线程(GUI线程)中进行。

5.3 与FreeCAD原生对象的交互

真正的价值在于融合。你的MxDraw图纸不应该是一个信息孤岛。

  • 数据关联:在MxDrawObject中定义属性,关联三维模型中的某个面、边或草图。例如,一个属性可以存储一个三维零件上某个平面的ID,MxDraw中的二维视图可以是对该平面的投影展开图。
  • 双向更新:
    • 从3D到2D:当三维模型更改时,通过App::DocumentObject::execute()方法触发更新,可以调用MxDraw控件的COM接口,重新生成或更新关联的二维视图。
    • 从2D到3D:在MxDraw中标注的尺寸或注释,可以通过事件监听,将其作为参数或约束写回FreeCAD的三维模型的某个属性中。这需要设计一套轻量级的映射协议。
  • 实现示例思路:
    // 假设在MxDrawObject中有一个属性关联到三维空间中的一个位置
    App::PropertyVector LinkedPosition;
    
    // 在MxDrawView中,可以监听绘图变化,并更新此属性
    void MxDrawView::onDrawingModified() {
        QAxBase* mx = axWidget->querySubObject("GetMxDraw");
        QVariant pos = mx->dynamicCall("GetLastPoint()"); // 假设有这个方法
        // 解析pos,并更新LinkedPosition
        // m_docObject->LinkedPosition.setValue(...);
        m_docObject->getDocument()->recompute(); // 触发文档重算
    }
    

5.4 内存管理与对象生命周期

  • QAxWidget析构:确保MxDrawView在关闭时,QAxWidget能被正确析构。使用QPointer来管理视图指针(如我们在ViewProviderMxDraw中所做)是一个好习惯,它可以自动在对象被Qt删除后置为空指针,防止野指针访问。
  • COM资源释放:虽然QAxWidget会管理大部分COM资源,但在频繁创建/销毁包含ActiveX控件的窗口时,仍需留意。如果遇到资源泄漏,可以尝试在MxDrawView的析构函数中显式调用axWidget->clear()。

集成MxDraw控件到FreeCAD,本质上是一场在开源架构与商业组件之间的“搭桥”工程。它考验的不仅是对FreeCAD插件系统的熟悉程度,还有对Qt ActiveX框架以及COM技术的灵活运用。从最初的环境搭建、架构设计,到中期的代码实现、界面融合,再到后期的调试优化与功能深化,每一步都需要耐心和细致的思考。我自己的经验是,先把最简单的“显示一个空白控件”跑通,然后逐步添加打开文件、基本绘图命令,最后再攻克与FreeCAD数据同步的难题。过程中多利用FreeCAD的Python控制台和Qt的调试输出,它们能帮你快速定位问题所在。当你看到自己熟悉的二维CAD操作界面在FreeCAD中流畅运行,并与三维模型产生联动时,那种成就感会让你觉得所有的折腾都是值得的。

FreeCAD二维绘图太弱?手把手教你用MxDraw 5.2增强功能(附完整配置流程) 本文针对FreeCAD二维绘图功能的不足,提供了通过二次开发集成专业二维CAD控件MxDraw 5.2的完整解决方案。文章详细介绍了从环境搭建、理解FreeCAD文档-视图架构,到实现MxDraw文档对象、视图提供者及自定义视图窗口的完整配置流程,旨在帮助中高级用户在不切换软件的前提下,显著增强FreeCAD的二维绘图与DWG文件处理能力。 阅读详情

相关推荐

FreeCAD二次开发实战:MxDraw二维CAD控件深度集成指南

本文详细介绍了如何在FreeCAD中深度集成MxDraw二维CAD控件,以弥补其原生二维绘图功能的不足。通过二次开发,将专业的二维CAD功能无缝嵌入FreeCAD界面,实现三维参数化建模与高质量二维工程图绘制的协同工作。指南涵盖了从环境准备、FreeCAD文档/视图架构解析到具体的代码实现步骤,帮助开发者提升设计效率。

weixin_29266679的博客 504

梦想CAD二次开发

mxdraw是一个HTML5 Canvas JavaScript框架,它在THREE.js的基础上扩展开发,为用户提供了一套在前端绘图更为方便,快捷,高效率的解决方案,mxdraw的实质为一个前端二维绘图平台。mxdraw.js依赖canvas标签打开画布,但由于canvas会根据父元素的宽高来自动调整大小,为保证绘制不失真需要固定canvas父级的宽高,且在父元素上设置属性overflow:hidden。MxCAD: MxCAD APP 插件的二次开发项目(用户可在该基础上开发功能)

On the way 1266

【技术分享】H5小游戏开发入门指南

Web前端游戏已经不是什么新鲜事物了,近10年来,客户端游戏的市场被web前端游戏抢占不少,从最开始用flash制作的PC页游,再到H5小游戏,爆款频出。那么,作为一名前端开发者,要如何从0开始入门游戏开发呢?今天我以2020年八戒财税八八节营销活动的h5小游戏(接金币)为例,来讲一讲一些具体的环节。 一、H5小游戏所需要的的一些知识 首先,既然是web前端开发的小游戏,一些前端的知识,我们前端开发工程师平时已经掌握的非常熟练的了,比如: 1.基础开发语言:html、css、javascript...

weixin_45348938的博客 9635

mxGraph破解说明

<br />破解步骤:<br />1、先在官网http://www.jgraph.com/mxgraph.html上下载:mxgraph-eval-1_5_1_3.zip;<br />2、解压后取文件夹:mxgraph/javascript/examples/editors,所有

蓝云的专栏 9893

mxdraw

梦想绘图控件是,使用VC编程语言,经过多年开发,完全自主平台的二维失量绘图控件,可以打开所有dwg文件,已经支持AutoCAD2008的dwg图纸,可用于各种工程绘图,和专业软件的开发。 支持ARX编程接口,因为数据库结构模仿AutoCAD ARX的数据库结构,所以能很好的支持ARX编程,ARX编程接口将来会不断的完善和加强,达到ARX程序即能在AutoCAD平台运行,也在控件上运行的目的。  VC版的控件使用VC.net2005开发,它已经被做成ActiveX控件,可以被VC,VB,C#等语言调用,也可在网页上使用,并且ActiveX控件的源代码是开放的。  具有完全知识产权的,独特的空间搜索算法、显示缓存技术、图元处理技术、内存池等技术,使其显示速非常快。控件网址,可下载到最新版本:www.mxdraw.com

dwgviewx破解版+使用DEMO 网页CAD在线预览

dwgviewx破解版+使用DEMO 网页CAD在线预览

FreeCAD二次开发实战:如何用MxDraw控件打造专属CAD工具(避坑指南)

本文详细介绍了在FreeCAD二次开发中集成MxDraw二维CAD控件的实战方法与避坑指南。通过剖析FreeCAD文档-视图架构,指导开发者创建自定义对象与视图提供者,并重点解决了使用QAxWidget集成ActiveX控件时遇到的编译、运行时兼容性及性能优化等核心难题,旨在帮助开发者打造兼具三维参数化与专业二维绘图能力的混合工具。

weixin_29248611的博客 575

html dwg 展示

volo 的一些资料,大家可以看看 里面有详细的属性解释,不过是中文的

WPF使用梦想OCX插件入门

获取控件 下载控件安装包 注册控件 注册控件之前请先退出杀毒软件(如360杀毒软件),双击运行CopyReleaseFile.bat和CopyReleaseFileX64.bat获取批处理文件,并以管理员身份运行RegistMxDrawX.exe 实现批注册或以管理员方式运行控件 \Bin\vc100\RegistMxDrawX.exe 。 新建一个工程 1、运行Visual St...

u013725001的专栏 1690

梦想CAD控件3.0

2009.05.10更新 更新下载地址: http://www.mxdraw.com/downland/MxDraw3.0(20090510)BetaTryVersion.exe 1. 增加布局功能和相关接口,如:McDbLayout,McDbLayoutManager等类。 2. 增加鼠标移动到实体上的动态提示功能和相关接口。如: // ARX的动态事件接口,虚函数。 virtual Mcad::ErrorStatus McEdInputPointMonitor::MonitorInputPointToolTip(IN const McDbObjectIdArray& pickedEntities, IN const McGePoint3d& pickedPoint, IN CString& sNewToolTipString ); ActiveX的动态提示事件函数 CMxDrawOcxCtrl::FireMonitorInputPointToolTip(LONG lId, BSTR* pToolTip) 3. 增加图层管理功能和相关接口。如: ActiveX的图层导出接口. SHORT CMxDrawOcxCtrl::GetLayerIdArray(VARIANT* pArrayId); SHORT CMxDrawOcxCtrl::GetLayerProp(LONG lId, BSTR* pszName, BSTR* pszLineTypeName, SHORT* pIsOff, SHORT* pIsLock, SHORT* pIsFrozen, BYTE* pR, BYTE* pG, BYTE* pB); SHORT CMxDrawOcxCtrl::SetLayerOff(LONG lId, SHORT iIsOff); 4. 导出dwf功能和相关接口。如: BOOL MxDraw::ExprotDwf(MXDRAWOCXHANDLE hOcx, LPCTSTR pszDwfFilePath ); 5. 安装包中增加调试版lib文件和dll文件,方便控件使用者调试程序. 6. 增加放大镜功能 7. 修正一堆细节上的错误

DWGViewXPro(32bit 64bit),在线显示cad文档

直接解压缩编辑demo.html中打开文件地址,然后打开文件即可使用,使用前先运行Ret.bat 注册dll。

二维三维图纸web在线预览

前言:因公司业务需求,需要实现dwg、dwf、stl、stp、x_t等二三维图纸在web端在线预览的功能。图纸兼容与浏览器兼容都很重要,经过这段时间的技术调研,基本确认了几种实现方案,选择(自主开发难度较大,只考虑现有产品) 方案一:使用浩辰看图SDK。该产品只针对二维图纸,具有很好的兼容性...

churui8119的博客 3054

梦想dwg浏览控件

简介: 控件相关说明: 梦想dwg控件是经过多年的研发,具有完全的知识产权,和自主开发平台的显示图形核心,显示速非常快,主要针对二维的图形处理的控件。控件属于共享软件,使用前必须注册。关于控件的详细信息可与msn: MxDraw@hotmail.com联系. 控件运行说明: 控件是使用VC2005开发,所以程序运行时,当前电脑上必须安装VC2005运行库,如果你没有安装VC2005运行库或运行时提示出错信息时,需要点击控件目录vcredist_x86.exe安装VC2005运行库.

易语言调用MxDraw画圆弧教程

易语言进行CAD二次开发并绘制圆弧,其核心在于通过COM接口或第三方控件(如梦想绘图控件)与CAD内核或DWG文件处理引擎进行交互。虽然易语言本身不直接支持AutoCAD的ActiveX对象模型,但可以通过调用外部DLL或使用支持COM的控件来实现。下面将结合梦想绘图控件(MxDraw)这一常见方案,提供一个具体的实现示例。

m0_66048236的博客 250

人形机器人硬件开发:骨架系统设计全攻略

本文以人形机器人骨架系统为核心研究对象,系统解析其从理论建模到工程实现的全流程设计方法。通过融合刚体力学、材料科学与机器人控制理论,构建"概念基础-理论框架-架构设计-实现机制-实际应用-高级考量-综合拓展"的七层分析体系。重点覆盖运动学/动力学建模、轻量化结构设计、关节模块集成、多物理场耦合优化等关键技术,结合波士顿动力Atlas、本田ASIMO等经典案例,提供从原型设计到量产验证的工程实践指南。

AI天才研究院 1879

微机原理与接口技术第六版周荷琴课后习题答案及解析(期末重点)

第二章 1.8086/8088CPU可直接寻址多少个内存(字节)单元?多少个I/O端口?它们的外部数据总线各有多少根? 8086/8088CPU使用的是20位地址总线,因此可以直接寻址2的20次方个内存单元(即1,048,576),每个单元大小为1字节,因此可以直接寻址2的20次方个字节的内存。 8086/8088CPU有64K个I/O端口,每个端口占用1字节的地址空间,因此可以直接寻址6...

Wmicheng的博客 1万+

HTML5云图,MxDraw云图

首先把DWG文件通过我们的工具Bin/Release/MxFileConvert.exe把DWG文件转换成我们自己格式mxb格式,它是一个控制台程序,将来可以做成后台自动调用。比如,把my.dwg转成my.dwg.mxb,如下:转换成功后,把my.dwg.mxb和my.dwg拷贝到后台程序所在目录,这样前台程序就能自动找到并打开图纸,如下:addFunSearchPath函数增加后台服务搜索文件目...

weixin_32861907的博客 906

麒麟OS(Kylin OS)操作系统minikube+docker安装使用及遇到的问题

一 ,安装minikube及操作工具kubectl 1,安装kubectl 使用以下命令下载最新版本: curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" 要下载指定版本(例如v1.22.0版本) ,请键入: curl -LO https://dl.k8s.io/release/v1.22.0/bin/linux/amd..

qq_23396017的博客 2643

CAD使用控件把DWG文件转成位图

说明 CAD控件提供的接口,可以把dwg文件转换成Bmp,Jpg文件,也可以把DWG文件中某个区域的图形绘制到CDC上或保存为Bmp文件。这些接口即能在VC中使用,也能在VB,C#,Delphi,网页中调用。 DwgToJpg 不需要使用CAD控件打开dwg文件,直接把dwg文件转成jpg文件。 VC接口: BOOL MxDraw::DwgToJpg(IN LPCTST...

u013725001的专栏 1598

Jetson nano 系列之2—板载摄像头IMX219启动

我选用的是亚博科技jetson nano的开发板。

驽马十驾,功在不舍;锲而不舍,金石可镂。 4275

CLASSB类移植(满足IEC 60730-1和60355-1标准)

针对软件认证需要满足IEC 60730-1和60335-1标准,ST公司专门提供的软件扩展包X-CUBE-CLASSB,它包含自测库和文档,支持多种STM32系列芯片,通过预集成测试库和标准化流程,帮助开发者快速满足国际安全标准,适用于家电、工业控制等高可靠性场景。ClassB软件包程序检测内容分为两个主要部分:启动时的自检和运行时的周期自检,MCU在上电的时候会进行复位启动,在启动完成以后会进行运行自检。

m0_61973119的博客 1402

CAD控件教程:安装使用手册

安装及控件界面说 1、 安装说明··· 3 2、 控件运行说明··· 8 3、 控件界面说明··· 8 4、 控件常用工具条··· 8 1、 安装说明 安装文件:,扩号中的“(20140912)”是安装程序打包时间,尽量使用最新的安装包程序,可随时关注网上的最新版下载。安装包是Winrar自解压程序,安装过程也是rar压缩包解压过程,完全绿色安

u013725001的专栏 3429

把冷门数据从内存里请出去:ABAP 环境下玩转 SAP HANA Native Storage Extension (NSE) 的开发者实战笔记

摘要:SAP HANA NSE技术为ABAP系统提供了一种经济高效的温数据管理方案。文章首先指出企业数据存在"温度分层"现象,高频访问的热数据需常驻内存,而低频温数据更适合存储在磁盘或闪存。NSE通过混合列存架构,将不常访问的数据移至磁盘但仍保持数据库内统一管理,显著降低内存成本。 关键实施要点包括:在ADT技术设置中将Load Unit设为"Page Enforced"以启用NSE;理解buffer cache作为数据"抽屉"的工作原理;掌握选表

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 164

CAD控件:界面控制说明和方法

更新时间:2015 年08 月24 日 界面控制说明 目录 1.1 说明: ......................................................................................................................................... 4 1.2 菜单栏 .......

u013725001的专栏 4081

【YOLOv11】070、YOLOv11异常检测:正常数据训练下的异常目标识别

本文探讨了如何利用YOLOv11模型进行工业异常检测,重点介绍了仅使用正常样本训练模型的创新方法。文章首先通过产线误报案例引出异常检测的核心问题,阐述了YOLOv11作为特征提取器的改造思路,包括正常数据训练、特征空间构建和异常度量等关键步骤。实战部分提供了精简代码示例,强调数据增强控制、特征层选择和自编码器应用等技巧。作者还总结了容易出错的细节,如特征选择、阈值设定和计算效率优化等,并给出实用建议:从简单方法入手、重视可视化、确保数据质量、部署时设置复核机制等。最后指出该方法虽能减少对异常样本的依赖,但需

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 235

【ARM Trace32(劳特巴赫) 使用介绍 13 -- Trace32 Var 变量篇】

例如我们已经知道一个符号(可能是变量或者函数)的地址,怎么确定这个地址是一个变量还是一个函数呢?如果是变量的话,变量名是啥?变量定义的位置在哪?如果是函数,函数名是啥?函数定义的位置又在哪呢?查看结构体变量 str_t32 的值。例如我们已经知道了一个符号的地址为。在map文件中的地址为。

CodingCos的博客 2350
上一篇: 阿克曼结构移动机器人的gazebo仿真(三):配置控制器与运动实现
下一篇: ReID中的姿态估计:如何利用OpenPose提升行人重识别准确率
linux6sysadmin
博客等级 码龄4年 59粉丝 1615原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值