arx 常用操作


BOOL CArxDialog::OnInitDialog(void)
{

    CButton * pBut = (CButton* )GetDlgItem(IDC_BUTTON4);
    pBut->SetWindowText(_T("GetPoint"));

    //二 在对话框中预览DWG文件
    //    使用acdbDisplayPreviewFromDwg函数,具体的方法为:
    //    char fileName[100];
    //strcpy(fileName, "C://test.dwg");
    //bool es;
    //HWND pWnd;
    //CFrameWnd *pFrame = (CFrameWnd*)GetDlgItem(IDC_PICTURE); 

    //es = acdbDisplayPreviewFromDwg(fileName, pFrame->m_hWnd);
    //上面的代码将在一个Picture控件中显示指定的图形。
    //    另外,需要包含“dbmain.h”头文件。

    //CStatic * pPic = (CStatic* )GetDlgItem(IDC_STATIC);
    //pBut->SetWindowText(_T("GetPoint"));

    //ACHAR *fileName = _T("c://drawing1.dwg");


    //char fileName[100];
    //strcpy(fileName, "C://test.dwg");
    //bool es;
    //HWND pWnd;
    //CFrameWnd *pFrame = (CFrameWnd*)GetDlgItem(IDC_STATIC); 

    //es = acdbDisplayPreviewFromDwg(fileName, pFrame->m_hWnd);

    CListCtrl *pListCtrl = (CListCtrl *) GetDlgItem(IDC_LIST1);

    //设置背景颜色
    //pListCtrl->SetBkColor(RGB(10,200,255));
    pListCtrl->ModifyStyle(0, WS_VISIBLE |    WS_CHILD  |    LVS_REPORT );

    DWORD dwExtStyles =pListCtrl->GetExtendedStyle();
    pListCtrl->SetExtendedStyle(dwExtStyles | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

    //设置第一行为选中状态
    //    int nIndex = 0;
    //pListCtrl->SetItemState(0,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
    
    pListCtrl->InsertColumn(0,_T("名称"),LVCFMT_LEFT,100,0);  //设置列
    //pListCtrl->InsertColumn(1,_T("数据"),LVCFMT_LEFT,100,1);


    //pListCtrl->InsertItem(0,   _T("类型"));//插入行
    
    
    //pListCtrl->SetItemText(0,1,_T("中梃"));//设置该行的不同列的显示字符    

    //pListCtrl.InsertItem(1,   "型号");//插入行
    //pListCtrl.SetItemText(1,1,"5002");//设置该行的不同列的显示字符

    //pListCtrl.InsertItem(2,   "长度");//插入行
    //pListCtrl.SetItemText(2,1,"5000");//设置该行的不同列的显示字符

    //DisplayBlocks() ;


    return 0;
}

//-----------------------------------------------------------------------------
//----- Needed for modeless dialogs to keep focus.
//----- Return FALSE to not keep the focus, return TRUE to keep the focus
LRESULT CArxDialog::OnAcadKeepFocus (WPARAM, LPARAM) {
    return (TRUE) ;
}


//void CArxDialog::OnEnKillfocusEdit1()
//{
//    // TODO: 在此添加控件通知处理程序代码
//
//    AfxMessageBox(_T("1") ,0,0) ;
//
//
//}

void CArxDialog::OnBnClickedButton2()
{
    // TODO: 在此添加控件通知处理程序代码
    AfxMessageBox(_T("2") ,0,0) ;

}

void CArxDialog::OnBnClickedButton4()
{
    // TODO: 在此添加控件通知处理程序代码

    BeginEditorCommand();

    ads_point  pt ;

    if(acedGetPoint (NULL , _T("\nInput a Point : ") ,pt )  == RTNORM)
    {
        CompleteEditorCommand() ;

        m_strXpt .Format(_T("%0.2f") , pt[X]);
        m_strYpt .Format(_T("%0.2f") , pt[Y]);
        m_strZpt .Format(_T("%0.2f") , pt[Z]);

        CEdit * pEdit1 = (CEdit* )GetDlgItem(IDC_EDIT1);
        pEdit1->SetWindowText(
            _T( "x:" + m_strXpt + "  y:"+ m_strYpt + "  z: " + m_strZpt
            ));

    }
    else
    {
        CancelEditorCommand();
    }

    
}

//void CArxDialog::OnBnClickedOk()
//{
//    // TODO: 在此添加控件通知处理程序代码
//
//    //acedArxUnload(_T("ArxProject2.arx"));
//
//
//    //
//    //exit(0);
//}

//void CArxDialog::OnBnClickedCancel()
//{
//    // TODO: 在此添加控件通知处理程序代码
//
//
//    //CArxDialog::OnClose();
//
//}

void CArxDialog::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    DisplayBlocks();
}

void CArxDialog::DisplayBlocks(void)
{

    CListCtrl *m_ctrlBlockListBox = (CListCtrl *) GetDlgItem(IDC_LIST1);

    //m_ctrlBlockListBox->InsertItem(1,  _T("000") );//插入行
    //m_ctrlBlockListBox->SetItemText(1,1,_T("001"));//设置该行的不同列的显示字符
    
    //AfxMessageBox(_T("0001"));

    AcDbBlockTable *pBlockTable;
    acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(pBlockTable, AcDb::kForRead);
    // Iterate through the block table and display 
    // the names in the list box.
    //
    //const char *pName;
    ACHAR *pName ;
    AcDbBlockTableIterator *pBTItr;
    if (pBlockTable->newIterator(pBTItr) == Acad::eOk) {
        while (!pBTItr->done()) {
            AcDbBlockTableRecord *pRecord;
            if (pBTItr->getRecord(pRecord, AcDb::kForRead)
                == Acad::eOk) {
                pRecord->getName(pName);

                    int nIndex = m_ctrlBlockListBox->GetItemCount();

                    m_ctrlBlockListBox->InsertItem(nIndex,  (CString )pName );//插入行                    
                    //m_ctrlBlockListBox->SetItemText(nIndex,1,_T(""));//设置该行的不同列的显示字符
                    
                    pRecord->close();
            }    
            pBTItr->step();
        }
    }
    pBlockTable->close();

}

void CArxDialog::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
    // TODO: 在此添加控件通知处理程序代码
    *pResult = 0;

    //双击
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

    int nSelected = pNMListView->iItem; //选择所在行的索引值
    int nSubItem = pNMListView->iSubItem;    //选择所在列的索引值

    CListCtrl *m_ctrlBlockListBox = (CListCtrl *) GetDlgItem(IDC_LIST1);
    CString cr = m_ctrlBlockListBox->GetItemText(nSelected, nSubItem) ;
    //cr.Format(_T("%d-- %d-- %s"),nSelected,nSubItem, m_ctrlBlockListBox->GetItemText(nSelected, nSubItem));

    //AfxMessageBox(cr,0,0) ;

// 显示预览图标
CPaintDC dc(this);
 
AcDbBlockTable *pBlkTbl = NULL;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForRead);
 

AcDbObjectId blkTblRcdId;
Acad::ErrorStatus es = pBlkTbl->getAt(cr, blkTblRcdId);
 //AfxMessageBox(cr) ;
HBITMAP hBitmap = BlockIconToBMP(blkTblRcdId, dc.GetSafeHdc());


CStatic *m_bitmap =( CStatic *) GetDlgItem(IDC_STATIC);
m_bitmap->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);

HBITMAP hBitmap2 = ReplaceColor(hBitmap,   RGB(0,0,0),RGB(255,255,255)  );
m_bitmap->SetBitmap((HBITMAP)hBitmap2);


//pBlkTblRcd->close();
pBlkTbl->close();
UpdateData(FALSE);


}


HBITMAP CArxDialog::BlockIconToBMP(const AcDbObjectId &blkId, HDC hdc)
{
Acad::ErrorStatus es;
AcDbBlockTableRecord *pBlkTblRcd = NULL; // 块表记录的指针
AcArray<Adesk::UInt8> icon;  // 保存预览图标的数组
 
// 获得保存块表记录的预览图标的数组
try

es = acdbOpenObject(pBlkTblRcd, blkId, AcDb::kForRead);
if (es != Acad::eOk)
throw 1;
 
if (!pBlkTblRcd->hasPreviewIcon()) // 如果块定义不包含预览图标

pBlkTblRcd->close();
return NULL;
}
 
es = pBlkTblRcd->getPreviewIcon(icon);
if (es != Acad::eOk)
throw 2;
es = pBlkTblRcd->close();
if (es != Acad::eOk)
throw 3;
}
catch (...)

pBlkTblRcd->close();
return NULL; 

 
// 由icon数组获得可显示的位图
BITMAPINFOHEADER ih; // 位图信息头
memcpy(&ih, icon.asArrayPtr(), sizeof(ih));
size_t memsize = sizeof(BITMAPINFOHEADER) + ((1<<ih.biBitCount)* sizeof(RGBQUAD)); 
LPBITMAPINFO bi = (LPBITMAPINFO)malloc(memsize);  // 位图信息
memcpy(bi, icon.asArrayPtr(), memsize);
HBITMAP hbm = CreateDIBitmap(hdc, &ih, CBM_INIT,icon.asArrayPtr() + memsize, bi,DIB_RGB_COLORS);
free(bi);

return hbm;
}

HBITMAP CArxDialog::ReplaceColor(HBITMAP hBmp,COLORREF cOldColor,COLORREF cNewColor)
{
    HBITMAP RetBmp=NULL;
    if (hBmp)
    {   
        HDC BufferDC=CreateCompatibleDC(NULL);       // 源位图DC
        if (BufferDC)
        {
            SelectObject(BufferDC,hBmp);//选入DC中  
            HDC DirectDC=CreateCompatibleDC(NULL);      // 目标DC
            if (DirectDC)
            {
                // 获取源位图大小
                BITMAP bm;
                GetObject(hBmp, sizeof(bm), &bm);

                // 初始化BITMAPINFO信息,以便使用CreateDIBSection
                BITMAPINFO RGB32BitsBITMAPINFO;
                ZeroMemory(&RGB32BitsBITMAPINFO,sizeof(BITMAPINFO));
                RGB32BitsBITMAPINFO.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
                RGB32BitsBITMAPINFO.bmiHeader.biWidth=bm.bmWidth;
                RGB32BitsBITMAPINFO.bmiHeader.biHeight=bm.bmHeight;
                RGB32BitsBITMAPINFO.bmiHeader.biPlanes=1;
                RGB32BitsBITMAPINFO.bmiHeader.biBitCount=32;
                UINT * ptPixels;   

                HBITMAP DirectBitmap= CreateDIBSection(DirectDC,
                    (BITMAPINFO *)&RGB32BitsBITMAPINFO,
                    DIB_RGB_COLORS,(void **)&ptPixels, NULL, 0);
                if (DirectBitmap)
                {
                    HGDIOBJ PreviousObject=SelectObject(DirectDC, DirectBitmap);
                    BitBlt(DirectDC,0,0,bm.bmWidth,bm.bmHeight,BufferDC,0,0,SRCCOPY);

                    // 转换 COLORREF 为 RGB
                    cOldColor = COLORREF(cOldColor);
                    cNewColor = COLORREF(cNewColor);

                    //如果背景色是黑色
                    if(ptPixels[0] ==cOldColor)
                    {
                        // 替换颜色
                            for (int i=((bm.bmWidth*bm.bmHeight)-1);i>=0;i--)
                            {
                                if (ptPixels[i]== cOldColor || ptPixels[i]== cNewColor ) 
                                //颜色取反
                                ptPixels[i] = 0xFFFFFF -ptPixels[i] ;                                        
                            }                    

                    }

                    // 修改位图 DirectBitmap
                    SelectObject(DirectDC,PreviousObject);

                    // 完成
                    RetBmp=DirectBitmap;
                }
                // 释放DC
                DeleteDC(DirectDC);
            }
            // 释放DC
            DeleteDC(BufferDC);
        }
    }
    return RetBmp;
    
}
 

//    //CListCtrl双击
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

    int nSelected = pNMListView->iItem; //选择所在行的索引值
    int nSubItem = pNMListView->iSubItem;    //选择所在列的索引值

    CListCtrl *m_ctrlBlockListBox = (CListCtrl *) GetDlgItem(IDC_LIST1);
    CString cr ;
    cr.Format(_T("%d-- %d-- %s"),nSelected,nSubItem, m_ctrlBlockListBox->GetItemText(nSelected, nSubItem));
    AfxMessageBox(cr,0,0) ;
 

AcDbObjectId CArxProject1App::CreateLine(void)
{
    AcGePoint3d ptStart(0, 0, 0);
    AcGePoint3d ptEnd(100, 100, 0);
    AcDbLine *pLine = new AcDbLine(ptStart, ptEnd);
    AcDbBlockTable *pBlockTable;
    acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);
    AcDbBlockTableRecord *pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
    AcDbObjectId lineId;
    pBlockTableRecord->appendAcDbEntity(lineId, pLine);
    pBlockTable->close();
    pBlockTableRecord->close();
    pLine->close();
    return lineId;
}

Acad::ErrorStatus CArxProject1App::ChangeColor(AcDbObjectId entId, Adesk::UInt16 colorIndex)
{
    AcDbEntity *pEntity;
    // 打开图形数据库中的对象
    acdbOpenObject(pEntity, entId, AcDb::kForWrite);
    // 修改实体的颜色
    pEntity->setColorIndex(colorIndex);
    // 用完之后,及时关闭
    pEntity->close();
    return Acad::eOk;
    //return Acad::ErrorStatus();
}
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值