天天看點

CAD使用控件把DWG檔案轉成位圖 - 夢想CAD控件

CAD使用控件把DWG檔案轉成位圖

說明

CAD控件提供的接口,可以把dwg檔案轉換成Bmp,Jpg檔案,也可以把DWG檔案中某個區域的圖形繪制到CDC上或儲存為Bmp檔案。這些接口即能在VC中使用,也能在VB,C#,Delphi,網頁中調用。

DwgToJpg

不需要使用CAD控件打開dwg檔案,直接把dwg檔案轉成jpg檔案。

VC接口: 

        BOOL MxDraw::DwgToJpg(IN LPCTSTR pszDwgFilePath, 

        OUT LPCTSTR pszJpgFilePath, 

        int iWidth = -1, 

        int iHeight = -1);

COM接口: 

        bool DwgToJpg(string pszDwgFileName, string pszJpgFileName, int lWidth, int lHeight)

MxDrawXLib.IMxDrawApplication 的成員

參數 說明
pszDwgFilePath 轉入的DWG檔案路徑
pszJpgFilePath 另存為的JPG檔案路徑
iWidth 儲存後的JPG檔案的像素寬度
iHeight 儲存後的JPG檔案的像素高度

VC調用參考例程:

void CTestDlg::OnBnClickedDwgtojpgButton()
{
// TODO:
 
CPreviewFileDialog openDlg(TRUE,_T("dwg"),NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
//_T("dwg(*.dwg) | *.dwg||"),
_T("DWG files (*.dwg)|*.dwg|DXF files (*.dxf)|*.dxf|Jpg files (*.jpg)|*.jpg|BMP files (*.bmp)|*.bmp||"),
this);
 
CString sDwgFileName;
if(openDlg.DoModal() == IDOK)
{
sDwgFileName = openDlg.GetPathName();
}
else
{
return;
}
 
//
CString sJpgFilePath;
CFileDialog openJpgDlg(FALSE,_T("jpg"),NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("jpg(*.jpg) | *.jpg||"),
this);
if(openJpgDlg.DoModal() == IDOK)
{
sJpgFilePath = openJpgDlg.GetPathName();
}
else
{
return;
}
 
// 1000,1000是轉成jpg的像素寬度和高度。
if(MxDraw::DwgToJpg(sDwgFileName,sJpgFilePath,1000,1000) )
{
AfxMessageBox(_T("轉換成功"));
}
else
{
AfxMessageBox(_T("轉換失敗"));
}
 
}      

C#調用參考例程:

private void DwgToJpg_Click(object sender, EventArgs e)
        {
// 建立一個應用對象
            MxDrawApplication app = new MxDrawApplication();
 
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "Dwg 檔案(*.Dwg)|*.Dwg|Dxf files (*.Dxf)|*.dxf";
 
            if (ofd.ShowDialog() != DialogResult.OK)
            {
                return;
            }
 
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Filter = "jpg 檔案(*.jpg)|*.jpg";
 
            if (sfd.ShowDialog() != DialogResult.OK)
            {
                return;
            }
 
// 1000,1000是轉成jpg的像素寬度和高度。
            if(app.DwgToJpg(ofd.FileName, sfd.FileName, 1000, 1000) )
            {
 
                MessageBox.Show("轉換成功");
            }
            else
            {
                MessageBox.Show("轉換失敗");
            }
 
        }
    }      

WriteJpg

使用CAD控件打開dwg檔案或經過了編輯後,調用該函數把它另存為Jpg檔案。

VC接口: 

        BOOL  MxDraw::WriteJpg(MXDRAWOCXHANDLE hOcx,LPCTSTR pszJpgFilePath, 

        int iWidth = -1,int iHeight = -1); 

COM接口: 

        public virtual bool SaveJpgFile(string pszJpgFilePath, int lWidth, int lHeight)

AxMxDrawXLib.AxMxDrawX 的成員

參數 說明
hOcx 控件的辨別句柄
pszJpgFilePath 儲存的Jpg檔案路徑
lWidth 儲存後的Jpg檔案像素寬度,取預設值-1,程式就自動取4000
lHeight 儲存後的Jpg檔案像素高度,取預設值-1,程式就自動取4000

WriteBmp

使用CAD控件打開dwg檔案或經過了編輯後,調用該函數把它另存為Bmp檔案。

VC接口: 

        BOOL  MxDraw::WriteBmp(MXDRAWOCXHANDLE hOcx,LPCTSTR pszBmpFilePath, 

        int iWidth = -1,int iHeight = -1); 

COM接口: 

        public virtual bool SaveBmpFile(string pszBmpFilePath, int lWidth, int lHeight)

AxMxDrawXLib.AxMxDrawX 的成員

參數 說明
hOcx 控件的辨別句柄
pszJpgFilePath 儲存的Jpg檔案路徑
lWidth 儲存後的Jpg檔案像素寬度,取預設值-1,程式就自動取4000
lHeight 儲存後的Jpg檔案像素高度,取預設值-1,程式就自動取4000

VC調用參考例程:

void CTestDlg::OnBnClickedSavebmpButton()
{
// TODO: 在此添加控件通知處理程式代碼
CFileDialog openDlg(FALSE,_T("bmp"),NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("bmp(*.bmp) | *.bmp||"),this);
 
CString sFileName;
if(openDlg.DoModal() == IDOK)
{
sFileName = openDlg.GetPathName();
}
else
{
return;
}
 
if(!MxDraw::WriteBmp(m_hDrawOcx,sFileName) )
{
CString sError;
if(MxDraw::GetLastError().IsEmpty() )
sError = _T("儲存位圖檔案失敗!");
else
sError.Format(_T("儲存位圖檔案失敗!原因為:%s"),MxDraw::GetLastError());
AfxMessageBox(sError);
}
else
{
AfxMessageBox(_T("儲存成功"));
}
}      

DrawToDc

繪制CAD控件目前圖形中指定區域到CDC對象中。

VC接口: 

        BOOL MxDraw::DrawToDc(MXDRAWOCXHANDLE hOcx, 

        CDC* pDC, 

        int iDCx,int iDCy,int iDCWidth,int iDCHeight, 

        double dLbx,double dLby,double dRtx,double dRty

); 

AxMxDrawXLib.AxMxDrawX 的成員

參數 說明
hOcx 辨別控件的句柄
pDC 把指定區域的圖形中的内容繪制到pDC上
iDCx, iDCy 繪制pDC的左上角位置
iDCWidth,iDCHeight 繪制到pDC上的寬度和高度
dLbx, dLby   指定圖形區域的左下角坐标
dRtx, dRty   指定圖形區域的右下角坐标

VC調用參考例程:

void CTestCommands::DrawToBmp()
{
// 選擇讓用從圖上選擇個存位圖的區域。
acutPrintf(_T("\n 請點取存位圖的區域:"));
 
// 動态拖放輸入,讓使用者确定要儲存的區域
CRectSelJig getRect;
 
// pt1,pt2是矩形框的兩點
AcGePoint3d pt1,pt2;
if(!getRect.DoIt(pt1,pt2) )
return;
 
// 讓使用者選擇儲存的位圖檔案.
CTestDlg* pDlg = (CTestDlg*)AfxGetApp()->GetMainWnd();
CFileDialog openDlg(FALSE,_T("bmp"),NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("bmp(*.bmp) | *.bmp||"),
pDlg);
 
CString sFileName;
if(openDlg.DoModal() == IDOK)
{
sFileName = openDlg.GetPathName();
}
else
{
return;
}
 
int iBmpWidth  = 1000;
int iBmpHeight = 500;
 
// 開始儲存檔案.
CDC dc;
dc.Attach(::GetDC(NULL));
 
CBitmap bm;
bm.CreateCompatibleBitmap(&dc,iBmpWidth,iBmpHeight);
 
CDC tmpDc;
tmpDc.CreateCompatibleDC(&dc);
CBitmap*pOld = tmpDc.SelectObject(&bm);
 
if(MxDraw::DrawToDc(MxDraw::GetCurOcxHandle(),
&tmpDc,0,0,iBmpWidth,iBmpHeight,
pt1.x,pt1.y,pt2.x,pt2.y
)
)
{
tmpDc.SelectObject(pOld);
if(SaveBmp(&bm,&dc,sFileName) )
{
AfxMessageBox(_T("儲存成功"));
}
else
{
AfxMessageBox(_T("儲存失敗"));
}
 
}
else
{
AfxMessageBox(_T("未知原因,儲存失敗"));
tmpDc.SelectObject(pOld);
}
}      
bool CTestCommands::SaveBmp(CBitmap* pBmp,CDC* pDc,const CString& sBmpFilePath)
{
if(sBmpFilePath.IsEmpty() )
{
AfxMessageBox(_T("檔案路徑為空"));
return false;
}
BITMAP btm;
pBmp->GetBitmap(&btm);
 
DWORD size   = btm.bmWidthBytes * btm.bmHeight;
LPSTR lpData = (LPSTR)GlobalAlloc(GPTR,size);
/////////////////////////////////////////////
BITMAPINFOHEADER bih;
bih.biBitCount=btm.bmBitsPixel;
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=0;
bih.biHeight=btm.bmHeight;
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biSizeImage=size;
bih.biWidth=btm.bmWidth;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;
///////////////////////////////////
GetDIBits(pDc->GetSafeHdc(),*pBmp,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
 
BITMAPFILEHEADER bfh;
bfh.bfReserved1=bfh.bfReserved2=0;
bfh.bfType=((WORD)(\'M\'<< 8)|\'B\');
bfh.bfSize=54+size;
bfh.bfOffBits=54;
bool isSuc = false;
CFile bf;
if(bf.Open(sBmpFilePath,CFile::modeCreate|CFile::modeWrite))
{
bf.Write(&bfh,sizeof(BITMAPFILEHEADER));
bf.Write(&bih,sizeof(BITMAPINFOHEADER));
bf.Write(lpData,size);
bf.Close();
isSuc = true;
}
else
{
AfxMessageBox(_T("建立檔案失敗"));
}
GlobalFree(lpData);
return isSuc;
}