运用ObjectARX进行AutoCAD二次开发实例
运用ObjectARX进行AutoCAD二次开发实例

构和 代 码 , 直接 访 问 Auo A 数 控 库 结构 、 tC D 图形 系
【 要】介绍 了运用 O j cA X进行 A tC D二次开发 摘 b e tR uoA
o Auo f t CAD S c n De eo me t e gn e n a p iai n e o d v lp n i n ie r g p l t . n i c o
的实现 过程 内容 包括建立设备 图库 、 设备 数据库 , 设备 图 对
空 间 内运 行 并 能直 接 利 用 Auo A 核 心 数 据 库 结 tC D
o e aige u p n al r d q i me t t b s . h s x mp e p r t i me t l y a up n a a e T i e a l n q g e n e a d C i c et g h o g d f i g r gse h r c s f n a dr ts t .T r u h mo i n e itr i t e p o e s o e n i y n s t g t i lme t d r c la e y a p ia in a d dr c et ,i mp e n i t o d d b p l t n i e c o n i t e
20 jc A X概 述 betR
在 A tC D 提 供 的各 种 开发工 具 中 , CC + uo A 以 /+ 开发 工具 的效率最 高 、 能最强 。 uo AD使用 一种 功 A tC 特 定 CC +编程 环 境—0b c X。O jc X 包 /+ jt e AR bet AR 含一 组 CC +类 库 , 些库 与 A tC D 在 同一地 址 /+ 这 uo A
基于ObjectARX的AutoCAD二次开发及应用实例

地址空问 内运行并 能直接 利用 A t A uo D核心 数据库 和代 码 , C 利 用 A t A 的开放结 构 , 以直接访 问 A t A uC oD 可 uo D数据库用程 序 的运 行 机 制 R
O j tR b c X程 序 本 质 上 是 Wi o s动 态 链 接 库 ( L ) eA nw d D L 程
序 “ 与 A tC D共 享 地 址 空 间 , betR 可 以 监 控 和处 理 A — , uo A Oj A X c u
维普资讯
计 算 机 应 用
'
.
‘ 自动化技术与应用)o6 2o 年第 2 卷第 5 5 期
,
o u erAp l a in mp t pi t s c o
基 于 O jc R 的 A tC D二 次 bet X A uo A
开 发 及 应 用 实例
关键 词 : u C D;O j tR At A o be A X;Vsa C+ +;二 次 开 发 c i l u
中 图 分 类 号 :T 3 17 文 献 标识 码 :A 文 章编 号 :10 —2 120 )503—3 P 9 .2 0 374 (0 60 — 50 0
T eS c n ay D v lp n f t C t jcAR h e o d r e eo me to o AD wi Obe t X Au h
形 系统 以 及 C D几何 造 型 核 心 , 此 , betR A 因 O j A X应 用 程 序 具 有 e
系统之 间采 用 Widw 的消息传递机制直 接通信 。在 加载 A X no s R
AutoCAD2010二次开发环境搭建

AutoCAD2010二次开发环境搭建(ObjectARX2010 、VC++2008)本文以AutoCAD2010、开发包ObjectARX2010、VC++2008为例,详细介绍其二次开发前期工作,包括环境搭建、简单的例子等。
一、首先安装AutoCAD2010中文版和VS2008二、安装ObjectArx2010直接打开解压缩到某个目录即可。
比如D:\Program Files\ObjectARX_2010_32_64bit 然后打开D:\ProgramFiles\ObjectARX_2010_32_64bit\utils\ObjARXWiz目录,运行ArxWizards.msi程序,这样在新建C++项目的时候会出现ObjectARX项目,如图所示:向导创建过程中,除MFC Support选择支持外,其余默认即可,点击Finish 完成创建。
如下图:三、包含文件打开“工具->选项->项目和解决方案->VC++目录”选项,如图所示:添加包含文件( 图中红线部分目录即可):添加包含库文件(图中红线部分目录即可):四、简单例子以上开发环境搭建完毕,再举一个简单例子。
1.新建Object项目后打开acrxEntryPoint.cpp,点击左上角的图标(一个未知问题导致我的小图标不显示,但是不影响创建)弹出ObjectARXCommands。
2.在ObjectARX Commands中右键新建(New)一个命令,只需要修改International Name与Localized Name即可,例如_MyTest和MyTest 。
3.添加完成后,会在acrxEntryPoint.cpp中自动添加一句代码,然后在里面可以添加自己需要的代码,比如弹出一个对话框的代码:AfxMessageBox(L"This is my test");然后生成解决方案。
如下图:4.加载与运行运行AutoCAD2010,输入命令Ap或者管理目录下的“加载应用程序”加载在项目中win32\debug目录下的ArxProject2.arx文件。
C#AutoCAD2018ObjectArx二次开发添加圆对象的的例子(五)

C#AutoCAD2018ObjectArx⼆次开发添加圆对象的的例⼦(五)1、创建⼀个图形对象的步骤如下见上⼀篇博客(三)2、添加删除实体的⼯具函数见上⼀篇博客(四)3、添加圆的例⼦(完整源代码请加云幽学院免费课)[CommandMethod("MKCircle")]public void MKCircle(){//(1)获取当前活动图形数据库Database db = HostApplicationServices.WorkingDatabase;//(2)新建⼀个circle对象Point3d cenPt = new Point3d(0, 100, 0); //圆⼼Circle cir= new Circle(cenPt, Vector3d.ZAxis, 100);//(3)定义⼀个指向当前数据库的事务处理,以添加直线using (Transaction trans = db.TransactionManager.StartTransaction()){//(3-1)以读⽅式打开块表..BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);//(3-2)以写⽅式打开模型空间块表记录BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);//(3-3)将图形对象的信息添加到块表记录中,并返回ObjectId对象.btr.AppendEntity(cir);//(3-4)把对象添加到事务处理中.trans.AddNewlyCreatedDBObject(cir, true);//(3-5)提交事务处理mit();}}这个例⼦⾮常简单,想学习AutoCAD⼆次开发(c#、C++等语⾔)、BIM软件⼆次开发、Java、python等在线课程的同学,请关注云幽学院的视频课程。
基于objectarx二次开发在autocad中实现QQ抽屉效果

基于objectarx二次开发在autocad中实现QQ抽屉效果操作步骤:1.在vs2005中创建一个基于objectarx的应用程序,程序名为:WPJ-STRUCTURE。
2.添加基于CAcUiDockControlBar的类CDockControlBar,添加后,程序会增加类文件“DockControlBarChildDlg.h”和“DockControlBarChildDlg.cpp”,并在资源中自动添加ID为“IDD_DOCKCONTROLBAR”的对话框面板,同时生成类文件“DockControlBarChildDlg.h”和“DockControlBarChildDlg.cpp”。
3.添加GfxGroupEdit.cpp、GfxGroupEdit.h、GfxPopupMenu.cpp、GfxPopupMenu.h、GfxOutBarCtrl.cpp、GfxOutBarCtrl.h到工程中,在文件GfxGroupEdit.cpp和GfxPopupMenu.cpp中添加如下代码:#include "DockControlBarChildDlg.h"。
4.在资源文件中导入三个光标文件,分别命名其ID为:IDC_DRAGGING、IDC_HANDCUR、IDC_NODRAGGING;并添加Icon资源,分别命名其ID为:ID_GFX_LARGEICON、ID_GFX_REMOVEITEM、ID_GFX_RENAMEITEM、ID_GFX_SMALLICON。
5.在“DockControlBarChildDlg.h”文件中添加:#define IDC_LST_MENU WM_USER+1000#include "resource.h"#include "GfxOutBarCtrl.h"6.在“DockControlBarChildDlg.h”文件中添加变量:CGfxOutBarCtrl wndBar;7.在“DockControlBarChildDlg.h”文件中添加消息函数:afx_msg long OnOutbarNotify(WPARAM wParam, LPARAM lParam);8.在“DockControlBarChildDlg.cpp”文件中添加代码:ON_MESSAGE(WM_OUTBAR_NOTIFY, OnOutbarNotify)9.在“DockControlBarChildDlg.cpp”文件中添加OnOutbarNotify函数具体代码:long CDockControlBarChildDlg::OnOutbarNotify(WPARAM wParam, LPARAM lParam){switch (wParam){case NM_OB_ITEMCLICK:// cast the lParam to an integer to get the clicked item{int index = (int) lParam;CString cs, cs1;cs1 = wndBar.GetItemText(index);int iFloder = wndBar.GetSelFolder();cs.Format(_T("Clicked on %d Floder -> %d :: <%s>"), iFloder, (int)lParam, cs1);AfxMessageBox(cs);}return 0;case NM_OB_ONLABELENDEDIT:// cast the lParam to an OUTBAR_INFO * struct; it will contain info about the edited item// return 1 to do the change and 0 to cancel it{OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam;TRACE2(_T("Editing item %d, new text:%s\n"), pOI->index, pOI->cText);}return 1;case NM_OB_ONGROUPENDEDIT:// cast the lParam to an OUTBAR_INFO * struct; it will contain info about the edited folder// return 1 to do the change and 0 to cancel it{OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam;TRACE2(_T("Editing folder %d, new text:%s\n"), pOI->index, pOI->cText);}return 1;case NM_OB_DRAGITEM:// cast the lParam to an OUTBAR_INFO * struct; it will contain info about the dragged items// return 1 to do the change and 0 to cancel it{OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam;TRACE2(_T("Drag item %d at position %d\n"), pOI->iDragFrom, pOI->iDragTo);}return 1;}return 0;}10.在“DockControlBarChildDlg.cpp”文件中添加抽屉控件的初始化代码:DWORD dwf = CGfxOutBarCtrl::fDragItems|CGfxOutBarCtrl::fEditGroups|CGfxOutBarCtrl::fEditItems|CGfxOutBarCtrl::fRemoveGroups|CGfxOutBarCtrl::fRemoveItems|CGfxOutBarCtrl::fAddGroups|CGfxOutBarCtrl::fAnimation;wndBar.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,150-5,450-30),this,IDC_LST_MENU,dwf);wndBar.SetOwner(this);wndBar.AddFolder(_T("Folder 1"), 0);wndBar.AddFolder(_T("Folder 2"), 1);wndBar.AddFolder(_T("Folder 3"), 2);wndBar.AddFolder(_T("Folder 4"), 3); wndBar.SetSelFolder(1);wndBar.SetIfQueryRemove(true); 11.最终在autocad2007下的运行效果:附件:源代码GfxGroupEdit.h// Copyright (c) Iuri Apollonio 1998// Use & modify as you want & need, and leave those 4 lines.// Strongly based on article "Inplace edit control" of Mario Contestabile and "Editable subitems" of Zafir// #if !defined(AFX_GFXGROUPEDIT_H__CA5BB022_1277_11D2_843A_0000B43382FE__INCLUDED_)#define AFX_GFXGROUPEDIT_H__CA5BB022_1277_11D2_843A_0000B43382FE__INCLUDED_#if _MSC_VER >= 1000#pragma once#endif// _MSC_VER >= 1000// GfxGroupEdit.h : header file///////////////////////////////////////////////////////////////////////////////// CGfxGroupEdit windowclass CGfxGroupEdit : public CEdit{// Constructionpublic:CGfxGroupEdit();// Attributespublic:BOOL bEscapeKey;CString text;WPARAM msgSend;bool bNoDown;// Operationspublic:// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CGfxGroupEdit)public:virtual BOOL PreTranslateMessage(MSG* pMsg);protected:virtual void PostNcDestroy();//}}AFX_VIRTUAL// Implementationpublic:int iIndex;virtual ~CGfxGroupEdit();// Generated message map functionsprotected://{{AFX_MSG(CGfxGroupEdit)afx_msg void OnKillFocus(CWnd* pNewWnd);afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);//}}AFX_MSGDECLARE_MESSAGE_MAP()};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}// Microsoft Developer Studio will insert additional declarations immediately before the previous line.#endif// !defined(AFX_GFXGROUPEDIT_H__CA5BB022_1277_11D2_843A_0000B43382FE__INCLUDED_)GfxGroupEdit.cpp// Copyright (c) Iuri Apollonio 1998// Use & modify as you want & need, and leave those 4 lines.// Strongly based on article "Inplace edit control" of Mario Contestabile and "Editable subitems" of Zafir// // GfxGroupEdit.cpp : implementation file//#include"stdafx.h"#include"DockControlBarChildDlg.h"#include"GfxGroupEdit.h"#include"GfxOutBarCtrl.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CGfxGroupEditCGfxGroupEdit::CGfxGroupEdit(){bEscapeKey = FALSE;iIndex = -1;msgSend = NM_OB_ONGROUPENDEDIT;bNoDown = false;}CGfxGroupEdit::~CGfxGroupEdit(){}BEGIN_MESSAGE_MAP(CGfxGroupEdit, CEdit)//{{AFX_MSG_MAP(CGfxGroupEdit)ON_WM_KILLFOCUS()ON_WM_CREATE()ON_WM_CHAR()//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CGfxGroupEdit message handlersvoid CGfxGroupEdit::OnKillFocus(CWnd* pNewWnd){PostMessage(WM_CLOSE, 0, 0);if (!bEscapeKey){GetWindowText(text);if (text != "") GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, msgSend, (LPARAM) this);}}BOOL CGfxGroupEdit::PreTranslateMessage(MSG* pMsg){if (pMsg->wParam == VK_RETURN){PostMessage(WM_CLOSE, 0, 0);return TRUE;}else if (pMsg->wParam == VK_ESCAPE){PostMessage(WM_CLOSE, 0, 0);return bEscapeKey = TRUE;}return CEdit::PreTranslateMessage(pMsg);}void CGfxGroupEdit::PostNcDestroy(){CEdit::PostNcDestroy();delete this;}int CGfxGroupEdit::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CEdit::OnCreate(lpCreateStruct) == -1)return -1;SendMessage(WM_SETFONT,(WPARAM) GetStockObject(DEFAULT_GUI_FONT),MAKELPARAM(TRUE,0));return 0;}void CGfxGroupEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags){if (msgSend == NM_OB_ONGROUPENDEDIT){CEdit::OnChar(nChar, nRepCnt, nFlags);return;}if (nChar == VK_ESCAPE || nChar == VK_RETURN){if (nChar == VK_ESCAPE) bEscapeKey = TRUE;GetParent()->SetFocus();return;}CEdit::OnChar(nChar, nRepCnt, nFlags);CString str;CRect rect, parentrect;GetClientRect(&rect);GetParent()->GetClientRect(&parentrect);ClientToScreen(&rect);GetParent()->ScreenToClient(&rect);GetWindowText(str);CWindowDC dc(this);CFont *pFont = GetParent()->GetFont();CFont *pFontDC = dc.SelectObject(pFont);CRect szrc(rect);szrc.bottom = szrc.top;if (bNoDown == true){dc.DrawText(str, szrc, DT_CALCRECT);if (szrc.right >= parentrect.right - 1) rect.right = parentrect.right - 1;else rect.right = szrc.right;MoveWindow(&rect);return;}dc.DrawText(str, szrc, DT_WORDBREAK|DT_CENTER|DT_CALCRECT);dc.SelectObject(pFontDC);CSize size = szrc.Size();if (size.cx > rect.Width()){if (size.cx + rect.left < parentrect.right) rect.right = rect.left + size.cx;else rect.right = parentrect.right;MoveWindow(&rect);}else if (size.cy > rect.Height()){if (size.cy + rect.bottom < parentrect.bottom) rect.bottom = rect.top + size.cy;else rect.bottom = parentrect.bottom;MoveWindow(&rect);}}GfxPopupMenu.h// GfxPopupMenu.h: interface for the CGfxPopupMenu class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_GFXPOPUPMENU_H__F2CEE8B2_014D_11D2_83E4_0000B43382FE__INCLUDED_) #define AFX_GFXPOPUPMENU_H__F2CEE8B2_014D_11D2_83E4_0000B43382FE__INCLUDED_#if _MSC_VER >= 1000#pragma once#endif// _MSC_VER >= 1000class CGfxPopupMenu : public CMenu{public:struct ToolBarData{ // struct for toolbar resource; guess you already know it ;)WORD wVersion;WORD wWidth;WORD wHeight;WORD wItemCount;};struct SpawnItem{int iImageIdx;int iCmd;wchar_t cText[128];};struct ImageItem{int iImageIdx;int iCmd;};CGfxPopupMenu();virtual ~CGfxPopupMenu();HFONT hMenuBoldFont;bool CreateBoldFont();HFONT hMenuFont, hGuiFont;CSize szImage;int FindImageItem(const int cmd);SpawnItem * AddSpawnItem(const wchar_t * txt, const int cmd);void AddImageItem(const int idx, WORD cmd);void RemapMenu(CMenu * pMenu);CImageList ilList;CImageList ilOther;COLORREF crMenuText, crMenuTextSel;COLORREF cr3dFace, crMenu, crHighlight, cr3dHilight, cr3dShadow, crGrayText;COLORREF m_clrBtnFace, m_clrBtnHilight, m_clrBtnShadow;int iSpawnItem;SpawnItem ** pSpawnItem;int iImageItem;ImageItem * pImageItem;bool LoadToolBarResource(unsigned int resId);bool AddToolBarResource(unsigned int resId);void EnableMenuItems(CMenu * pMenu, CWnd * pParent);virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);};#endif// !defined(AFX_GFXPOPUPMENU_H__F2CEE8B2_014D_11D2_83E4_0000B43382FE__INCLUDED_)GfxPopupMenu.cpp// GfxPopupMenu.cpp: implementation of the CGfxPopupMenu class.////////////////////////////////////////////////////////////////////////#include"stdafx.h"#include"DockControlBarChildDlg.h"#include"GfxPopupMenu.h"#ifdef _DEBUG#undef THIS_FILEstatic wchar_t THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif////////////////////////////////////////////////////////////////////// // Construction/Destruction//////////////////////////////////////////////////////////////////////CGfxPopupMenu::CGfxPopupMenu(){crMenuText = GetSysColor(COLOR_MENUTEXT);crMenuTextSel = GetSysColor(COLOR_HIGHLIGHTTEXT);cr3dFace = GetSysColor(COLOR_3DFACE);crMenu = GetSysColor(COLOR_MENU);crHighlight = GetSysColor(COLOR_HIGHLIGHT);cr3dHilight = GetSysColor(COLOR_3DHILIGHT);cr3dShadow = GetSysColor(COLOR_3DSHADOW);crGrayText = GetSysColor(COLOR_GRAYTEXT);m_clrBtnFace = GetSysColor(COLOR_BTNFACE);m_clrBtnHilight = GetSysColor(COLOR_BTNHILIGHT);m_clrBtnShadow = GetSysColor(COLOR_BTNSHADOW);iSpawnItem = 0;pSpawnItem = NULL;iImageItem = 0;pImageItem = NULL;szImage = CSize(20,20);hMenuFont = NULL;/* COLORMAP cMap[3] = {{ RGB(128,128,128), cr3dShadow },{ RGB(192,192,192), cr3dFace },{ RGB(255,255,255), cr3dHilight }};CBitmap bmp;bmp.LoadMappedBitmap(IDB_MENUCHK, 0, cMap, 3);ilOther.Create(19, 19, ILC_COLOR4|ILC_MASK, 1, 0);ilOther.Add(&bmp, cr3dFace);bmp.DeleteObject();*/NONCLIENTMETRICS ncm;memset(&ncm, 0, sizeof(ncm));ncm.cbSize = sizeof(ncm);::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, (PVOID) &ncm, 0);hGuiFont = ::CreateFontIndirect(&ncm.lfMenuFont);// David 08/04/98 - start - bold font handlinghMenuBoldFont = NULL;CreateBoldFont();// David 08/04/98 - end - bold font handling}CGfxPopupMenu::~CGfxPopupMenu(){if (iSpawnItem > 0){for (int t = 0; t < iSpawnItem; t++)if (pSpawnItem[t]) delete pSpawnItem[t];GlobalFree((HGLOBAL) pSpawnItem);}if (iImageItem > 0){GlobalFree((HGLOBAL) pImageItem);}if (hMenuFont) ::DeleteObject((HGDIOBJ)hMenuFont);if (hMenuBoldFont) ::DeleteObject((HGDIOBJ)hMenuBoldFont);}void CGfxPopupMenu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){// CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);// CRect rcItem(lpDrawItemStruct->rcItem);// pDC->FillSolidRect(rcItem, RGB(255,0,0));if (lpDrawItemStruct->CtlType == ODT_MENU){UINT id = lpDrawItemStruct->itemID;UINT state = lpDrawItemStruct->itemState;bool bEnab = !(state & ODS_DISABLED);bool bSelect = (state & ODS_SELECTED) ? true : false;bool bChecked = (state & ODS_CHECKED) ? true : false;// David 08/04/98 - start - bold font handlingbool bBold = (state & ODS_DEFAULT) ? true : false;// David 08/04/98 - end - bold font handlingSpawnItem * pItem = (SpawnItem *) lpDrawItemStruct->itemData;if (pItem){CDC * pDC = CDC::FromHandle(lpDrawItemStruct->hDC);CFont * pft;// David 08/04/98 - start - bold font handlingif (!bBold) pft = CFont::FromHandle((HFONT) hMenuFont ? hMenuFont : hGuiFont);else pft = CFont::FromHandle((HFONT) hMenuBoldFont ? hMenuBoldFont : hGuiFont);// David 08/04/98 - end - bold font handlingCFont * of = pDC->SelectObject(pft);CRect rc(lpDrawItemStruct->rcItem);CRect rcImage(rc), rcText(rc);rcImage.right = rcImage.left + rc.Height();rcImage.bottom = rc.bottom;if (pItem->iCmd == -3) // is a separator{CPen pnDk(PS_SOLID,1,cr3dShadow);CPen pnLt(PS_SOLID,1,cr3dHilight);CPen * opn = pDC->SelectObject(&pnDk);pDC->MoveTo(rc.left + 2, rc.top + 2);pDC->LineTo(rc.right - 2, rc.top + 2);pDC->SelectObject(&pnLt);pDC->MoveTo(rc.left + 2, rc.top + 3);pDC->LineTo(rc.right - 2, rc.top + 3);pDC->SelectObject(opn);}else if (pItem->iCmd == -4) // is a title item{CString cs(pItem->cText), cs1;CRect rcBdr(rcText);if (bSelect && bEnab){rcText.top ++;rcText.left += 2;}pDC->FillSolidRect(rcText, crMenu);pDC->DrawText(cs, rcText, DT_VCENTER|DT_CENTER|DT_SINGLELINE);if (bSelect && bEnab) pDC->Draw3dRect(rcBdr,cr3dShadow,cr3dHilight); }else{rcText.left += rcImage.right + 1;int obk = pDC->SetBkMode(TRANSPARENT);COLORREF ocr;if (bSelect){if (pItem->iImageIdx >= 0 || (state & ODS_CHECKED))pDC->FillSolidRect(rcText, crHighlight);elsepDC->FillSolidRect(rc, crHighlight);ocr = pDC->SetTextColor(crMenuTextSel);}else{if (pItem->iImageIdx >= 0 || (state & ODS_CHECKED))pDC->FillSolidRect(rcText, crMenu);elsepDC->FillSolidRect(rc/*rcText*/, crMenu);ocr = pDC->SetTextColor(crMenuText);}if (pItem->iImageIdx >= 0){int ay = (rcImage.Height() - szImage.cy) / 2;int ax = (rcImage.Width() - szImage.cx) / 2;if (bSelect && bEnab)pDC->Draw3dRect(rcImage,cr3dHilight,cr3dShadow);else{pDC->Draw3dRect(rcImage,crMenu,crMenu);}if (bEnab){ilList.Draw(pDC, pItem->iImageIdx, CPoint(rcImage.left + ax, rcImage.top +ay), ILD_NORMAL);}else{HICON hIcon = ilList.ExtractIcon( pItem->iImageIdx );pDC->DrawState( CPoint(rcImage.left + ax, rcImage.top + ay ), szImage, (HICON)hIcon, DST_ICON | DSS_DISABLED, (CBrush *)NULL );}}else{if (bChecked){int ay = (rcImage.Height() - szImage.cy) / 2;int ax = (rcImage.Width() - szImage.cx) / 2;ilOther.Draw(pDC, 0, CPoint(rcImage.left + ax, rcImage.top + ay - 2), ILD_NORMAL);}}CString cs(pItem->cText), cs1;CSize sz;sz = pDC->GetTextExtent(cs);int ay1 = (rcText.Height() - sz.cy) / 2;rcText.top += ay1;rcText.left += 2;rcText.right -= 15;int tf = cs.Find('\t');if (tf >= 0){cs1 = cs.Right(cs.GetLength() - tf - 1);cs = cs.Left(tf);if (!bEnab){if (!bSelect){CRect rcText1(rcText);rcText1.InflateRect(-1,-1);pDC->SetTextColor(cr3dHilight);pDC->DrawText(cs, rcText1, DT_VCENTER|DT_LEFT);pDC->DrawText(cs1, rcText1, DT_VCENTER|DT_RIGHT);pDC->SetTextColor(crGrayText);pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT);pDC->DrawText(cs1, rcText, DT_VCENTER|DT_RIGHT);}else{pDC->SetTextColor(crMenu);pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT);pDC->DrawText(cs1, rcText, DT_VCENTER|DT_RIGHT);}}else{pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT);pDC->DrawText(cs1, rcText, DT_VCENTER|DT_RIGHT);}}else{if (!bEnab){if (!bSelect){CRect rcText1(rcText);rcText1.InflateRect(-1,-1);pDC->SetTextColor(cr3dHilight);pDC->DrawText(cs, rcText1,DT_VCENTER|DT_LEFT|DT_EXPANDTABS);pDC->SetTextColor(crGrayText);pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT|DT_EXPANDTABS);}else{pDC->SetTextColor(crMenu);pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT|DT_EXPANDTABS);}}elsepDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT|DT_EXPANDTABS);}pDC->SetTextColor(ocr);pDC->SetBkMode(obk);}pDC->SelectObject(of);}}}void CGfxPopupMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct){// lpMeasureItemStruct->itemWidth = 200;// lpMeasureItemStruct->itemHeight = 25;bool res = false;if (lpMeasureItemStruct->CtlType == ODT_MENU){UINT id = lpMeasureItemStruct->itemID;SpawnItem * pItem = (SpawnItem *) lpMeasureItemStruct->itemData;if (pItem){if (pItem->iCmd == -3) // is a separator{lpMeasureItemStruct->itemWidth = 10;lpMeasureItemStruct->itemHeight = 6;}else{CString cs(pItem->cText);if (!cs.IsEmpty()){CClientDC dc(AfxGetMainWnd());CFont * pft = CFont::FromHandle(hMenuFont ? hMenuFont : hGuiFont);CFont * of = dc.SelectObject(pft);CSize osz = dc.GetOutputTabbedTextExtent(cs,0,NULL);if (pItem->iCmd == -4){CRect rci(0,0,0,0);dc.DrawText(cs, rci,DT_CALCRECT|DT_TOP|DT_VCENTER|DT_SINGLELINE);lpMeasureItemStruct->itemHeight = rci.Height();lpMeasureItemStruct->itemWidth = rci.Width();}else{lpMeasureItemStruct->itemHeight = szImage.cy + 5;if (osz.cy > (int) lpMeasureItemStruct->itemHeight) lpMeasureItemStruct->itemHeight = (int) osz.cy;lpMeasureItemStruct->itemWidth = osz.cx + 2 + 15;lpMeasureItemStruct->itemWidth +=lpMeasureItemStruct->itemHeight > (UINT) szImage.cx ? (UINT) lpMeasureItemStruct->itemHeight : (UINT) szImage.cx;}dc.SelectObject(of);}else{lpMeasureItemStruct->itemHeight = szImage.cy + 5;lpMeasureItemStruct->itemWidth = 100;}}}}}bool CGfxPopupMenu::CreateBoldFont(){if (hMenuBoldFont)::DeleteObject((HGDIOBJ)hMenuBoldFont);LOGFONT lgFont;::GetObject (hMenuFont ? hMenuFont : hGuiFont, sizeof (lgFont), &lgFont);lgFont.lfWeight = FW_BOLD;hMenuBoldFont = CreateFontIndirect (&lgFont);return !!hMenuBoldFont;}bool CGfxPopupMenu::AddToolBarResource(unsigned int resId){// David 08/04/98 - start - put CMenuSpawn in DLLHINSTANCE hInst = AfxFindResourceHandle (MAKEINTRESOURCE(resId), RT_TOOLBAR);if (!hInst)return false;// David 08/04/98 - end - put CMenuSpawn in DLLHRSRC hRsrc = ::FindResource(/*AfxGetResourceHandle()*/hInst, MAKEINTRESOURCE(resId), RT_TOOLBAR);if (hRsrc == NULL) return false;HGLOBAL hGlb = ::LoadResource(/*AfxGetResourceHandle()*/hInst, hRsrc);if (hGlb == NULL) return false;ToolBarData* pTBData = (ToolBarData*) ::LockResource(hGlb);if (pTBData == NULL) return false;ASSERT(pTBData->wVersion == 1);CBitmap bmp;bmp.LoadBitmap(resId);int nBmpItems = ilList.Add(&bmp, RGB(192,192,192));bmp.DeleteObject();WORD* pItem = (WORD*)(pTBData+1);for(int i=0; i<pTBData->wItemCount; i++, pItem++){if(*pItem != ID_SEPARATOR)AddImageItem(nBmpItems++, (WORD) *pItem);}// ** it seem that Windows doesn't free these resource (from Heitor Tome)::UnlockResource(hGlb);::FreeResource(hGlb);// **return true;}bool CGfxPopupMenu::LoadToolBarResource(unsigned int resId){//David 08/04/98 - start - put CMenuSpawn in DLLHINSTANCE hInst = AfxFindResourceHandle (MAKEINTRESOURCE(resId), RT_TOOLBAR);if (!hInst)return false;//David 08/04/98 - end - put CMenuSpawn in DLLHRSRC hRsrc = ::FindResource(/*AfxGetResourceHandle()*/hInst, MAKEINTRESOURCE(resId), RT_TOOLBAR);if (hRsrc == NULL) return false;HGLOBAL hGlb = ::LoadResource(/*AfxGetResourceHandle()*/hInst, hRsrc);if (hGlb == NULL) return false;ToolBarData* pTBData = (ToolBarData*) ::LockResource(hGlb);if (pTBData == NULL) return false;ASSERT(pTBData->wVersion == 1);szImage.cx = (int) pTBData->wWidth;szImage.cy = (int) pTBData->wHeight;if(ilList.Create(szImage.cx, szImage.cy, ILC_COLOR4|ILC_MASK, pTBData->wItemCount, 0) == false)return false;ilList.SetBkColor(cr3dFace);CBitmap bmp;bmp.LoadBitmap(resId);ilList.Add(&bmp, RGB(192,192,192));bmp.DeleteObject();WORD* pItem = (WORD*)(pTBData+1);int nBmpItems = 0;for(int i=0; i<pTBData->wItemCount; i++, pItem++){if(*pItem != ID_SEPARATOR)AddImageItem(nBmpItems++, (WORD) *pItem);}// ** it seem that Windows doesn't free these resource (from Heitor Tome)::UnlockResource(hGlb);::FreeResource(hGlb);// **return true;}void CGfxPopupMenu::AddImageItem(const int idx, WORD cmd){if (iImageItem == 0)pImageItem = (ImageItem *) GlobalAlloc(GPTR, sizeof(ImageItem));elsepImageItem = (ImageItem *) GlobalReAlloc((HGLOBAL) pImageItem, sizeof(ImageItem) * (iImageItem + 1), GMEM_MOVEABLE|GMEM_ZEROINIT);ASSERT(pImageItem);pImageItem[iImageItem].iCmd = (int) cmd;pImageItem[iImageItem].iImageIdx = idx;iImageItem ++;}void CGfxPopupMenu::RemapMenu(CMenu * pMenu){static int iRecurse = 0;iRecurse ++;ASSERT(pMenu);int nItem = pMenu->GetMenuItemCount();while ((--nItem)>=0){UINT itemId = pMenu->GetMenuItemID(nItem);if (itemId == (UINT) -1){CMenu *pops = pMenu->GetSubMenu(nItem);if (pops) RemapMenu(pops);if (iRecurse > 0){CString cs;pMenu->GetMenuString(nItem, cs, MF_BYPOSITION);if (cs != ""){SpawnItem * sp = AddSpawnItem(cs, (iRecurse == 1) ? -4 : -2);pMenu->ModifyMenu(nItem,MF_BYPOSITION|MF_OWNERDRAW, (UINT) -1, (LPCTSTR)sp);}}}else{if (itemId != 0){UINT oldState = pMenu->GetMenuState(nItem,MF_BYPOSITION);if (!(oldState&MF_OWNERDRAW) && !(oldState&MF_BITMAP)){ASSERT(oldState != (UINT)-1);CString cs;pMenu->GetMenuString(nItem, cs, MF_BYPOSITION);SpawnItem * sp = AddSpawnItem(cs, itemId);pMenu->ModifyMenu(nItem,MF_BYPOSITION|MF_OWNERDRAW|oldState, (LPARAM)itemId, (LPCTSTR)sp);}}else{UINT oldState = pMenu->GetMenuState(nItem,MF_BYPOSITION);if (!(oldState&MF_OWNERDRAW) && !(oldState&MF_BITMAP)){ASSERT(oldState != (UINT)-1);SpawnItem * sp = AddSpawnItem(_T("--"), -3);pMenu->ModifyMenu(nItem,MF_BYPOSITION|MF_OWNERDRAW|oldState, (LPARAM)itemId, (LPCTSTR)sp);}}}}iRecurse --;}CGfxPopupMenu::SpawnItem * CGfxPopupMenu::AddSpawnItem(const wchar_t * txt, const int cmd) {if (iSpawnItem == 0)pSpawnItem = (SpawnItem **) GlobalAlloc(GPTR, sizeof(SpawnItem));elsepSpawnItem = (SpawnItem **) GlobalReAlloc((HGLOBAL) pSpawnItem, sizeof(SpawnItem) * (iSpawnItem + 1), GMEM_MOVEABLE|GMEM_ZEROINIT);ASSERT(pSpawnItem);SpawnItem * p = new SpawnItem;ASSERT(p);pSpawnItem[iSpawnItem] = p;lstrcpy(p->cText, txt);p->iCmd = cmd;if (cmd >= 0) p->iImageIdx = FindImageItem(cmd);else p->iImageIdx = cmd;iSpawnItem ++;return p;}int CGfxPopupMenu::FindImageItem(const int cmd){for (int t = 0; t < iImageItem; t++)if (pImageItem[t].iCmd == cmd) return pImageItem[t].iImageIdx;return -1;}void CGfxPopupMenu::EnableMenuItems(CMenu * pMenu, CWnd * pParent){ASSERT(pMenu);ASSERT(pParent);int nItem = pMenu->GetMenuItemCount();CCmdUI state;state.m_pMenu = pMenu;state.m_nIndex = nItem-1;state.m_nIndexMax = nItem;while ((--nItem)>=0){UINT itemId = pMenu->GetMenuItemID(nItem);if (itemId == (UINT) -1){CMenu *pops = pMenu->GetSubMenu(nItem);if (pops) EnableMenuItems(pops, pParent);}else{if (itemId != 0){state.m_nID = itemId;pParent->OnCmdMsg(itemId, CN_UPDATE_COMMAND_UI, &state, NULL);state.DoUpdate(pParent, true);}}state.m_nIndex = nItem-1;}}GfxOutBarCtrl.h// Copyright (c) Iuri Apollonio 1998// Use & modify as you want & need, and leave those 3 lines.// #if !defined(AFX_GFXOUTBARCTRL_H__28FA2CA4_11B7_11D2_8437_0000B43382FE__INCLUDED_)#define AFX_GFXOUTBARCTRL_H__28FA2CA4_11B7_11D2_8437_0000B43382FE__INCLUDED_#if _MSC_VER >= 1000#pragma once#endif// _MSC_VER >= 1000// GfxOutBarCtrl.h : header file///////////////////////////////////////////////////////////////////////////////// CGfxOutBarCtrl window#include<afxcoll.h>#define WM_OUTBAR_NOTIFY WM_USER + 1#define NM_OB_ITEMCLICK 1#define NM_OB_ONLABELENDEDIT 2#define NM_OB_ONGROUPENDEDIT 3#define NM_OB_DRAGITEM 4#define NM_FOLDERCHANGE 5struct OUTBAR_INFO{int index;const wchar_t * cText;int iDragFrom;int iDragTo;};class CGfxOutBarCtrl : public CWnd{// ConstructionDECLARE_DYNCREATE(CGfxOutBarCtrl)public:CGfxOutBarCtrl();enum { fSmallIcon = 1 << 0, fLargeIcon = 1 << 1, fEditGroups = 1 << 2, fEditItems = 1 << 3,fRemoveGroups = 1 << 4, fRemoveItems = 1 << 5, fAddGroups = 1 << 6,fDragItems = 1 << 7, fAnimation = 1 << 8, fSelHighlight = 1 << 9 };enum { ircIcon = 1, ircLabel = 2, ircAll = 3 };// Attributespublic:COLORREF crBackGroundColor, crBackGroundColor1;COLORREF crTextColor;COLORREF cr3dFace, crLightBorder, crHilightBorder, crShadowBorder, crDkShadowBorder;int iFolderHeight;int xSmallIconLabelOffset, yLargeIconLabelOffset;int ySmallIconSpacing, yLargeIconSpacing;int xLeftMargin, yTopMargin;bool bUpArrow, bDownArrow, bUpPressed, bDownPressed;CRect rcUpArrow, rcDownArrow;bool bLooping;int iHitInternal1, iHitInternal2;long lAnimationTickCount;int iLastSel, iSelAnimTiming;int iSelAnimCount;DWORD dwFlags;CPtrArray arFolder;int iLastFolderHighlighted;int iLastSelectedFolder;int iFirstItem;int iLastItemHighlighted;bool bPressedHighlight;int iLastDragItemDraw, iLastDragItemDrawType;class CBarItem{public:CBarItem(const wchar_t * name, const int image, DWORD exData);virtual ~CBarItem();int iImageIndex;wchar_t * cItem;。
AutoCAD官方.net二次开发教程

第 1章 Hello World: 工程的创建在这一章中,我们将不使用ObjectARX向导来创建一个新的工程。
我们将使用Visual Studio .NET来创建一个新的类库工程。
通过这个工程,你可以创建一个能被AutoCAD装载的.NET dll文件。
这个dll文件会向AutoCAD加入一个名为“HelloWorld”的新命令。
当用户运行这个命令后,在AutoCAD 命令行上将显示“Hello World”文本。
1) 启动Visual ,选择”文件>新建>工程”(File> New> Project)。
在新建工程对话框中选择工程类型为”Visual Basic 工程”,然后选择”类库”模板,在工程名字框中输入”Lab1”,然后选择工程存放的位置。
点击确定按钮来创建工程。
2) 在工程的Class1.vb文件中,一个公有类“Class1”已经被系统自动创建了。
接下来向这个类加入命令。
要加入命令,你必须使用AutoCAD .NET托管封装类。
这些托管封装类包含在两个托管模块中。
要加入对这两个托管模块的引用,请用鼠标右键单击”引用”然后选择”添加引用”。
在弹出的”添加引用”对话框中选择”浏览”。
在”选择组件”对话框中,选择AutoCAD 2006的安装目录(这里假定为C:\Program Files\AutoCAD 2006\),在这个目录下找到“acdbmgd.dll”然后选择并打开它。
再一次选择”浏览”,在AutoCAD 2006的安装目录下找到“acmgd.dll”并打开它。
当这两个组件被加入后,请单击”添加引用” 对话框中的”确定”按钮。
正如它们的名字所表示的,acdbmgd.dll包含ObjectDBX托管类,而acmgd.dll包含AutoCAD托管类。
3) 使用对象浏览器(Visual 的”查看>其它窗口>对象浏览器”菜单项)来浏览加入的两个托管模块所提供的类。
CAD二次开发实验1
实验一 ObjectARX .NET托管开发包的使用一、主要内容1、下载安装ObjectARX .NET托管开发包2、创建AutoCAD命令3、创建自定义用户菜单4、创建自定义用户工具条5、创建用户自定义窗体二、学时安排三、预习内容及要求回顾ObjectARX API和其托管API之间的对应关系;掌握不同API版本对应的开发版本;熟悉创建用户需求所要引用命名空间。
开发语言使用C#,AutoCAD版本2010,objectARX2010。
四、下载安装ObjectARX4.1下载ObjectARX不同的ACAD版本用不同的开发包及开发环境ACAD2000~ACAD2002 : VC++ 6.0ACAD2004~ACAD2006 : 2002ACAD2007~ACAD2009 : 2005ACAD2010~ACAD2011 : 2008ACAD2012~ : 2010下载ObjectARX在打开打开默认网页浏览器并浏览网站.的网页上,点击License & Download(许可&下载).填写必填字段并选择ObjectARX for AutoCAD 2010. 点击Submit(提交)按扭.在下载页, 点击Download Now(现在下载)使用下载管理器或点击Standard Download Method(标准下载方法)使用你的网页浏览器的默认下载方法下载.点击Save(保存)或用于保存文件到你的本地驱动器的选项。
指定下载ObjectARX SDK安装包文件存放的位置。
一旦安装包文件下载完成,就浏览你保存在本地的安装并双击它,安装向导将显示在ObjectARX <释放>对话框中, 指定一个新的安装位置或接受默认的安装位置。
点击Install(安装)按扭. 如果没有遇到问题,安装向导完成后关闭它安装ObjectARX向导和托管项目模板一旦ObjectARX SDK被安装,请使用默认目录c:\ObjectARX <Release>浏览它的安装文件夹。
AutoCAD二次开发的方法与实例
AutoCAD二次开发的方法与实例AutoCAD是一款广泛应用的CAD软件,具有二次开发的能力。
AutoCAD二次开发是将AutoCAD的API和开发工具与其他软件的API和工具结合使用,并将AutoCAD的功能与其他应用程序的功能集成。
AutoCAD二次开发可以自动化绘制过程,节省时间和人力,提高生产率。
AutoCAD二次开发的方法:1.使用ObjectARX进行自定义编程ObjectARX是一种C ++编程接口,可用于开发自定义应用程序和高级命令。
ObjectARX可以让程序员使用全局变量、类和函数等等。
使用这些概念来创建与AutoCAD交互的自定义应用程序。
ObjectARX还提供了一些命令、选项和工具来帮助程序员将其自定义代码集成到AutoCAD中。
2.使用Visual Basic for Applications (VBA)进行自定义编程VBA是一种广泛使用的面向对象编程语言,是Microsoft Office的一部分。
通过在AutoCAD的VBA编辑器中编写代码,程序员可以创建自定义命令和功能,以满足其特定的绘图需求。
VBA还提供了一些内置函数和对象,使编程更加简单和直观。
3.使用.NET Framework进行自定义编程使用.NET Framework,程序员可以使用多种编程语言(如C#、、F#等)来编写与AutoCAD交互的应用程序。
通过将.NET程序集嵌入到AutoCAD中,程序员可以创建自定义工具栏、菜单和命令。
.NET Framework还提供了大量的功能和类库,使得开发更加高效和简单。
AutoCAD二次开发的实例:1. 使用VBA实现批量修改AutoCAD文件名Sub BatchRename()Dim sDir As StringDim sOldName As StringDim sNewName As StringDim sMessage As StringsDir = InputBox(\。
ObjectARX二次开发的实例
用ARX向导创建螺钉实例的程序步骤(1)启动VS2005,选择【File/New/Project】,系统弹出如图1所示的对话框。
从项目列表中选择【ObjectARX/DBX/OMF Project】选项,输入ScutStds作为项目名称,指定适当的保存位置,单击【OK】。
图1(2)系统弹出如图2所示的对话框,输入你的注册名称(不要以数字开头),注意在MFC Support这一项选择AutoCAD MFC Extension Support选项,其他选项都使用默认值,单击【Finish】,完成项目的创建。
图2(3)在项目中增加一个类来封装自定义函数,选择【Project/Add Class】,弹出的对话框中选择【C++ Class】,单击【Add】,系统弹出如图3所示的对话框,输入CUtilEnts作为新类的名称,单击【Finish】完成。
图3(4)在左侧栏中进入Class View,选中刚刚新建的类CUtilEnts右键点击【Add/Add Function】,这类里增加一个函数AppendEntity,弹出如图所示的对话框,参照图中所示修改其属性。
单击【Finish】完成。
图4此时系统自动生成一个UtilEnts.h的头文件和一个UtilEnts.cpp的源文件。
//此函数将实体添加到图形数据库的模型空间,这样才能使创建的实体被显示出来AcDbObjectId AppendEntity(AcDbEntity *pEnt); //函数实现(在源文件UtilEnts.cpp中) { //获得指向块表的指针AcDbBlockTable *pBlockTable;acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable,AcDb::kForRead); //获得指向特定的块表记录(模型空间)的指针AcDbBlockTableRecord *pBlockTableRecord;pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite); //将AcDbLine类的对象添加到块表记录中AcDbObjectId EntityId;pBlockTableRecord->appendAcDbEntity(EntityId, pEnt);//关闭图形数据库的各种对象pEnt->close();pBlockTable->close();pBlockTableRecord->close();return EntityId;}如同上述步骤再添加一个函数DrawLine,见如图所示的操作。
CAD二次开发学习笔记五(在ObjectARX中使用MFC)
CAD二次开发学习笔记五(在ObjectARX中使用MFC)要实现的功能是:执行ArxModal命令,弹出如图所示对话框,选择点,则得到点坐标,选择角度则得到角度值。
步骤一:新建基于MFC的ObjectArx项目,参考:/greatverve/archive/2010/05/31/ObjectARX-HelloWorld.html 打开资源视图添加一个对话框ID修改为IDD_ARX_MODAL(右击资源视图中的对话框打开属性面板,可以修改ID)设计如图界面,ID如下:IDC_BUTTON_POINTIDC_BUTTON_ANGLEIDC_EDIT_XPTIDC_EDIT_YPTIDC_EDIT_ZPTIDC_EDIT_ANGLE选择两个Button把Owner Draw设置为True完成界面。
步骤二:打开类视图,右击项目->添加类(这里不是右击对话框添加类)这张图有点小错误,这里Dialog ID:IDD_ARX_MODAL Class name:CArxDialog 在类视图中右击CArxDialog类添加变量这样会在头文件中生成源文件中生成可以直接修改这两处代码添加其他变量。
private:CAcUiPickButton m_btnAngle;CAcUiPickButton m_btnPoint;CAcUiNumericEdit m_editXpt;CAcUiNumericEdit m_editYpt;CAcUiNumericEdit m_editZpt;CAcUiAngleEdit m_editAngle;void CArxDlg::DoDataExchange (CDataExchange *pDX) { CAcUiDialog::DoDataExchange (pDX) ;DDX_Control(pDX, IDC_BUTTON_POINT, m_btnPoint);DDX_Control(pDX, IDC_BUTTON_ANGLE, m_btnAngle);DDX_Control(pDX, IDC_EDIT_XPT, m_editXpt);DDX_Control(pDX, IDC_EDIT_YPT, m_editYpt);DDX_Control(pDX, IDC_EDIT_ZPT, m_editZpt);DDX_Control(pDX, IDC_EDIT_ANGLE, m_editAngle); }步骤三:为CArxDialog添加InitDialog消息响应。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【参考文献】 【1】王福军,张志民,等.AutoCAD2000 环境下 C/Visual C++ 应用程序开发教程[M].北京:北京希望电子出版
dir *.sld /b > mylist 此 操 作 将 创 建 mylist 文 件 , 可 将 其 传 递 给 SLIDELIB。 还可以通过文本编辑器来创建 mylist 文 件,只需列出幻灯文件名 (如果必要,还需列出路 径)。 要从 mylist 生成幻灯库 mylib,请输入下列命令: slidelib mlib < mylist 此条目将创建 mlib.slb 文件,其中包含 mylist 中 所列出的幻灯片的名称和定义。 通过以上命令将多个幻灯片组合到一个幻灯片 库文件(slb 文件)中,通过菜单文件调用幻灯库文件 就可以实现图块的直观显示,如图 1 所示。
储的文件,使用任何文本编辑器都可以编辑。在制作 过程中,先按照菜单编制语法,编写菜单文件;然后 通过控制程序中定义的外部函数,加载所制作的菜 单文件。这样新增了一个下拉菜单,实现对图库和数 据库的管理和操作,新增下拉菜单如图 2 所示。
图 2 控制程序菜单
3. 1. 3 图库中图块的使用 从上图所示的菜单中点选“车床”,将弹出图 3
The Application Example of AutoCAD Second Development with ObjectARX
XI Shi-liang
(China IPPR Engineering Corporation, Beijing 100089,China) 【Abstract】This article has introduced a developing process of AutoCAD Second Development with ObjectARX. The content include setting up equipment gallery and equipment database, and operating equipment gallery and equipment database. This example can direct setting. Through modifying register in the process of setting, it implement direct loaded by application and direct executing. It can be operated conveniently, and it is a good example
公用工程设计
Public Utilities Design
sld)的幻灯库文件(扩展名为 .slb)。slidelist 是指定幻 灯文件的列表。
下面显示的操作系统命令将创建一个 slidelist 文件供 SLIDELIB 使用。 所有要编译到幻灯库中的 幻灯文件都应放在单独的目录中。在 DOS 提示(5.0 版或更高版本)下输入:
公用工程设计
Public Utilities Design
【文章编号】1007-9467(2010)11-0088-04
运用 Object ARX 进行 Aut oCAD 二次开发实例
■席世亮(中国中元国际工程公司,北京 100089)
【摘 要】 介绍了运用 Obj ect ARX进行 Aut oCAD二次开发 的实现过程。内容包括建立设备图库、设备数据库,对设备图 库、数据库进行操作。本实例可以直接安装,安装过程中通过 修改注册表,实现应用程序直接加载,直接运行,操作简便,是 工程应用中对 Aut oCAD进行二次开发的一个很好的范例。 【关键词】Obj ect ARX; Aut oCAD;二次开发 【中图分类号】TU17 ;TP311 【文献标志码】 A
所示的样块对话框界面。对话框右面的设备图形与 左边的设备名称一一对应,直接点选设备名称或设 备图形,再点击确定按钮,AutoCAD 的命令行就会出 现 AutoCAD 的插入命令及需要输入的参数(插入比 例、旋转角度)提示,输入相应的参数,就实现了设备 图块的插入。
以上样块对话框的显示和样块的插入也是通过 菜单文件实现的,对话框中显示的每一个样块,对应 菜单文件中的一行语句。当样块很多时,编写菜单文 件的工作量也是比较大的。
2 Obj ect ARX概述
在 AutoCAD 提供的各种开发工具中,以 C/C++ 开发工具的效率最高、功能最强。AutoCAD 使用一种 特定 C/C++ 编程环境—ObjectARX。ObjectARX 包 含一组 C/C++ 类库,这些库与 AutoCAD 在同一地址 空间内运行并能直接利用 AutoCAD 核心数据库结 构和代码,直接访问 AutoCAD 数控库结构、图形系
为了提高编写菜单文件的效率,利用 C++ 语言的 文件处理功能,编写了一个自动生成菜单文件的程序。通 过这个程序,可以一次生成一类设备样块对应的菜单语 句,大大的减轻了编写菜单文件的工作量。 3. 2 建立设备参数数据库
在工艺设计中,常常需要了解各种工艺设备的
90
图 3 设备插入对话框
技术参数,为了方便设计人员查阅各种设备的技术 参数,我们建立了设备参数数据库,并在控制程序中 设置了数据库管理系统,实现对数据库的存储、查 询、检索、安全保护等功能。
2)制作图库的管理程序和管理界面。 3)使用图库中的图块。 3. 1. 1 绘制设备样块,制作样块幻灯库文件 设备样块的绘制直接在 AutoCAD 中按 1:1 的 比例绘制即可,需注意的是,必须在 0 层上绘制图 形,否则在将图形插入到其它图形中时,会引起层和 颜色的混乱。 设备样块绘制完成之后,为了能够在应用中得 到直观的图库管理界面,需要为图库中的每个样块 生成一个幻灯片(SLD 文件)。可以使用 AutoCAD 中 的 MSLIDE 命令来生成当前图形的幻灯片,然后利 用 AutoCAD 提供的 SLIDELIB 幻灯片库管理实用程 序 ,可 以 从 幻 灯(SLD)文 件 构 造 幻 灯 片 库(SLB)文 件。 下面是构造幻灯库的操作系统命令行语法: slidelib library < slidelist 其中,library 是指定在其中添加幻灯文件(扩展名为 .
社,2000. 【2】 [ 美 ]David J. Kruglinski, Scot Wingo, George Shepherd,希望图书创作室,译,Visual C++6.0 技术内 幕[M].北京:希望电子出版社,1999. 【3】张君,周杰,等.InstallShield6.X/VB/VC/Delphi 安装程序设 计与制作[M].北京:北京希望电子出版社,2001.
图 1 设备插入对话框
3. 1. 2 制作图库的管理界面 本系统借助 AutoCAD 的菜单来管理和使用图
库中的设备样块。AutoCAD2000 以上支持部分菜单 加载机制,也就是说在不退出现有菜单的基础上,可
89
公用工程设计
Public Utilities Design
以增加其它菜单。 AutoCAD 的菜单文件是使用 ASCII 码格式存
88
of AutoCAD Second Development in engineering application. 【Key words】ObjectARX;AutoCAD;second development
1 引言
AutoCAD 是目前工程设计中使用最为广泛的绘 图软件。它的通用性使得它在各行各业得到了极为 广泛的应用。它提供的开放的体系结构和多样化的 开发工具使我们在使用过程中根据自身需要进行定 制或开发成为可能。这里,我们根据使用需要,利用 AutoCAD 提 供 的 最 新 的 开 发 工 具 ObjectARX,对 AutoCAD 进行了二次开发。
整个系统开发过程包括四部分。 3. 1 设备图库的开发
开发图库有多种方法,如利用 ObjectARX 提供 的专门操作图形数据库的函数,或利用 AutoCAD 提 供的基本图块功能等。这里我们利用 AutoCAD 提供 的基本图块功能进行图库的开发。具体开发过程如 下:
1)绘制图库中的设备样块,制作样块幻灯库文 件。
统以及 CAD 几何造型核心,以便能在运行期间实时 扩展 AutoCAD 具有的类及其功能,以及创建全面享 受 AutoCAD 固有命令之特权的新命令[1]。
ObjectARX 是 在 AutoCAD 原 有 的 开 发 系 统 (ADS)的基础上发展起来的一种面向对象的 C/C++ 开发环境。
3 系统开发过程
对数据库中各种设备参数表的操作包括:数据
公用工程设计
Public Utilities Design
// W
//
//
Φ
Φ
Φ
无级变速
ΦΦຫໍສະໝຸດ 图 4 设备参数数据库设备参数表
查找、数据修改、数据添加等功能。数据库管理对话 框如图 5 所示。
4 结语
通过对 AutoCAD 进行二次开发,可以满 足不同的个性化的使用要求,简化设计过程, 提高我们的工作效率。本系统是 AutoCAD 使 用中常用功能开发的一个典型范例,以上对 开发过程做了简单的介绍,供各位同行借鉴。
设备参数数据库是用 Access 制作的,每一类设 备对应一个设备参数表,参数表中包括样片名称、设 备名称、设备型号及主要规格、制造者、电力、重量、 单价、备注(设备外形尺寸)等字段,每一字段根据其 内容,设置不同数据类型。每一类设备的参数表如图 4 所示。 3. 3 数据库管理程序和界面