Qt ObjectARX实现获取AutoCAD的实体的DXF数据


ObjectARX为Auto CAD的二次开发工具。

准备工作:

1) Visual studio2017

2) QT4.12.2

3) Auto CAD2020

4) ObjectArx 2020 SDK

5) ObjectArx Wizard 2020向导

以上是需要用到的软件和环境,本文对环境搭建不做阐述,重在记录实现功能。

实现的功能介绍:

Auto CAD命令行中有自带获取实体数据的命令"LIST"。使用Ctrl+F2打开CAD文本窗口,输入LIST命令,选中实体获取数据。

但是这样获取到的数据只能呈现在Auto CAD软件中,如若我们要将数据传输到QT或QML中,然后使用这些数据在QT或QML中画出相应图像或者用这些数据做其它事情,我们应该如何实现呢?

整体框架一览:

前提:必须已完成本文章开头实现ObjectARX+QT与CAD交互功能!!!

First:代码展示

Second:代码解释

Third:运行结果展示(图片)。

Fourth:总结

代码展示:所有代码展示完的下方有对于代码的解释。

dialogpp代码:

1 #include "dialog.h" 2 #include "ui_dialog.h" 3 #include<tchar.h> 4 5 6 Dialog::Dialog(QWidget *parent) : 7 QDialog(parent), 8 ui(new Ui::Dialog) 9 16 17 Dialog::~Dialog() 18 21 22 int nCount = 0; 23 24 25 26 27 std::string g_sAllData = ""; 28 /*获得实体数据 实际为非扩展数据*/ 29 void Dialog::on_pushButton_4_clicked() 60 rbEnt =acdbEntGet(entName); 61 pBuf = rbEnt; 62 TCHAR buf[133]; 64 for (i = 0; pBuf != NULL; i++, pBuf = pBuf>rbnext) 100 else 107 break; 108 case RTREAL: 109 if (pBuf>restype == RTREAL) 115 else 122 break; 123 case RTSTR: 124 if (pBuf>restype == RTSTR) 130 else 137 break; 138 case RT3DPOINT: 139 if (pBuf>restype == RT3DPOINT) 152 else 165 break; 166 case RTLONG: 167 acutPrintf(TEXT("RTLONG : %d\n"), 168 pBuf>resval.rlong); 169 ui>textEdit_3>append(QStringLiteral("\n RTLONG:") + QString::number(pBuf>resval.rlong)); 170 g_sAllData += QString::number(pBuf>resval.rlong).toStdString() + '\n'; 171 break; 172 case 1: 173 case RTENAME: 174 acutPrintf(TEXT("(%d<Entity name:>)\n"), 175 pBuf>restype, pBuf>resval.rlname[0]); 176 ui>textEdit_3>append(QStringLiteral("\n <Entity name: %x>:") + ',' + QString::number(pBuf>resval.rlname[0],16)); 177 g_sAllData += QString::number(pBuf>resval.rlname[0]).toStdString() + '\n'; 178 break; 179 case 3: 180 acutPrintf(TEXT("(3)\n")); 181 ui>textEdit_3>append("(3)"); 182 g_sAllData += "(3)" + '\n'; 183 } 184 185 if ((i == 23) && (pBuf>rbnext != NULL)) 190 } 191 192 } 193 } 194 emit sendAllData(g_sAllData); 195 g_sAllData = ""; 196 return; 197 198 } 199 200 201 /*连接服务器*/ 202 void Dialog::on_pushButton_clicked() 208 209 void Dialog::recvData(int data) 214 215 void Dialog::on_pushButton_2_clicked() 219 220 221 void Dialog::on_pushButton_3_clicked()

dialog.h代码:

1 #ifndef DIALOG_H 2 #define DIALOG_H 3 4 #include <QDialog> 5 #include <Windows.h> 6 #include <arxHeaders.h> 7 #include <acedCmdNF.h> 8 9 #include "xiancheng.h" 10 11 12 namespace Ui 15 16 class Dialog : public QDialog 17 ; 50 51 #endif // DIALOG_H

this_mainpp代码:

1 #pragma warning( push) 2 #pragma warning (disable: 4189 4100 ) 3 //#define _AFXDLL 4 //#define _AFXDLL 5 #include <Windows.h> 6 #include <arxHeaders.h> 7 #include "Dialog.h" 8 #pragma warning( pop) 9 #include<QtWidgets/QApplication> 10 #include <string_view> 11 #include <iostream> 12 #include <string> 13 #include <fstream> 14 #include <cstring> 15 #include <string.h> 16 #include <QString> 17 #include <QStringList> 18 #include <QLabel> 19 #include <stdio.h> 20 //#include <rxmfcapi.h> 21 22 //#include <afx.h> 23 24 25 26 using namespace std::string_literals; 27 28 #include <QtWidgets> 29 #include <QtQml> 30 #include <QMessageBox> 31 32 struct resbuf* pBuf; 33 int flag = 0; 34 int i = 0; 35 double dCount[10]; 36 namespace 49 inline char** getArgv() ; 52 std::copy(qtApplicationPath.begin(), qtApplicationPath.end(), 53 static_cast<char*>(acadpath)); 54 argv[0] = static_cast<char *>(acadpath); 55 return argv; 56 } 57 } 58 }/*namespace*/ 59 60 inline void ShowQtWindow() 68 69 70 extern "C" AcRx::AppRetCode 71 acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt) 84 ; 87 varImage.width(); 88 varImage.height(); 89 } 90 } 91 /*****************************************/ 92 acedRegCmds>addCmand( 93 L"SSTD_GLOBAL_CMD_GROUP", 94 L"ShowQtWindow", 95 L"ShowQtWindow", 96 ACRX_CMD_MODAL, 97 &ShowQtWindow); 98 99 100 }break; 101 case AcRx::kUnloadAppMsg: break; 102 default:break; 103 } 104 return AcRx::kRetOK; 105 } 106 107 108 109 /********************************/ 110

xianchengpp代码:

1 #include "xiancheng.h" 2 xiancheng::xiancheng() 3 6 int nRnt = 99; 7 std::string g_sDxfData = ""; 8 9 10 char cBuff[50]; 11 12 13 void xiancheng::run(); 18 std::string str = "123456789"; 19 char sBuffLenth[5]; 20 std::string sSum = ""; 21 22 int nClientSock = socket(AF_INET, SOCK_STREAM, 0); 23 24 struct sockaddr_in serverAddr; 25 memset(&serverAddr, 0, sizeof (serverAddr)); 26 serverAddr.sin_family = AF_INET; 27 serverAddr.sin_port = htons(写端口); 28 serverAddr.sin_addr.s_addr = inet_addr("写IP地址"); 29 30 int nRet = ::connect(nClientSock, (struct sockaddr*)&serverAddr, sizeof(serverAddr)); 31 if(nRet < 0) 34 itoa(g_sDxfData.length(),cPop,10); 35 int nLenths = send(nClientSock, cPop, sizeof(cPop), 0); 36 if(nLenths > 0) 39 nRnt = send(nClientSock, g_sDxfData_str(), g_sDxfData.length(), 0); 40 acutPrintf(TEXT("Socket send data to Service")); 41 emit sendData( g_sDxfData.length()); 42 g_sDxfData = ""; 43 if(nRnt < 0) 45 else 48 49 } 50 51 void xiancheng::recvAllData(std::string data)

xiancheng.h代码:

1 #ifndef XIANCHENG_H 2 #define XIANCHENG_H 3 4 #include <QThread> 5 #include <QDebug> 6 7 #include <string> 8 #include <Windows.h> 9 #include <winsock.h> 10 #include <arxHeaders.h> 11 #include <acedCmdNF.h> 12 #include <tchar.h> 13 14 typedef struct data_TdataSize_T; 19 20 class xiancheng:public QThread 21 ; 34 35 #endif // XIANCHENG_H

代码解析:

dialogpp:

此代码最主要部分为on_pushButton4_clicked()函数部分,第二个for循环上方部分为选择实体,可以选择单个实体或者多个实体。第二个for循环下方里面为获取实体的所有数据。

this_mainpp:

ShowQtWindow()函数为展示QT的UI界面。将此函数通过命令形式在CAD中打开用到的是下图的方式。在CAD中输入"ShowQtWindow"语句后可以在CAD中打开QT的界面

xianchengpp:

此代码编写的是一个Socket的客户端用于将dialogpp代码中获取到的CAD实体数据传输给服务端。

运行结果:

1)在Auto CAD的命令行中输入ShowQtWindow(命令可以随意命名,在this_mainpp中修改)打开QT界面获取实体数据。

2)将获取到的实体数据通过Socket传输到另外一个QT项目中。

总结:

1) 实现的功能是,通过手动选择的方式获取到Auto CAD中实体的数据并将其传输到QT中。

2)本文章未展示Socket服务端方面的代码(因为在另外一个QT项目工程里非此项目工程)。不过服务端项目工程也只是接收本文章客户端方面发来的数据,仅此而已。

3)ObjectARX对于Auto CAD的二次开发过程中会有很多问题,需要耐心解决和细心研究。

4)本文章代码编写方法以及代码编写规范等其它方面还有很多不足之处,请各位见谅。如若各位看官有独到见解还望不吝赐教。



上一篇:Qt ObjectARX 2022

下一篇:EPLAN 安装教程


Qt
Copyright © 2002-2019 k262电脑网 www.k262.cn 皖ICP备2020016292号
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!QQ:251442993 热门搜索 网站地图