⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.cpp

📁 CAD转换工具 CAD转换工具 CAD转换工具 CAD转换工具
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <cadimage.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmCADImageDLLdemo *frmCADImageDLLdemo;
//---------------------------------------------------------------------------
__fastcall TfrmCADImageDLLdemo::TfrmCADImageDLLdemo(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TfrmCADImageDLLdemo::FormCreate(TObject *Sender)
{
  PaintBox1->Align = alClient;
  OpenDialog1->Filter = "CAD Drawings|*.dwg;*.dxf;*.plt;*.hgl;*.hg;*.hpg;*.plo;*.hp;*.hp1;*.hp2;*.hpgl;*.hpgl2;*.gl2;*.prn;*.spl;*.rtl;*.cgm;*.svg";
  CADHandle = 0;
  nDestOffX = 0;
  nDestOffY = 0;
  bFileLoaded = false;
  CADImageDLL = LoadLibrary("CADImage.dll");
  if (CADImageDLL)
  {
    CADLayout = (CADLAYOUT) GetProcAddress(CADImageDLL, "CADLayout");
    CADLayoutName = (CADLAYOUTNAME) GetProcAddress(CADImageDLL, "CADLayoutName");
    CADLayoutsCount = (CADLAYOUTSCOUNT) GetProcAddress(CADImageDLL, "CADLayoutsCount");
    CADUnits = (CADUNITS) GetProcAddress(CADImageDLL, "CADUnits");
    CloseCAD = (CLOSECAD) GetProcAddress(CADImageDLL, "CloseCAD");
    CreateCAD = (CREATECAD) GetProcAddress(CADImageDLL, "CreateCAD");
    CurrentLayoutCAD = (CURRENTLAYOUTCAD) GetProcAddress(CADImageDLL, "CurrentLayoutCAD");
    DefaultLayoutIndex = (DEFAULTLAYOUTINDEX) GetProcAddress(CADImageDLL, "DefaultLayoutIndex");
    DrawCAD = (DRAWCAD) GetProcAddress(CADImageDLL, "DrawCAD");
    DrawCADEx = (DRAWCADEX) GetProcAddress(CADImageDLL, "DrawCADEx");
    GetBoxCAD = (GETBOXCAD) GetProcAddress(CADImageDLL, "GetBoxCAD");
    SaveCADtoBitmap = (SAVECADTOBITMAP) GetProcAddress(CADImageDLL, "SaveCADtoBitmap");
    SaveCADtoJpeg = (SAVECADTOJPEG) GetProcAddress(CADImageDLL, "SaveCADtoJpeg");
    SaveCADtoGif = (SAVECADTOGIF) GetProcAddress(CADImageDLL, "SaveCADtoGif");
  }
  else
  {
    CADLayout = NULL;
    CADLayoutName = NULL;
    CADLayoutsCount = NULL;
    CADUnits = NULL;
    CloseCAD = NULL;
    CreateCAD = NULL;
    CurrentLayoutCAD = NULL;
    DefaultLayoutIndex = NULL;
    DrawCAD = NULL;
    DrawCADEx = NULL;
    GetBoxCAD = NULL;
    SaveCADtoBitmap = NULL;
    SaveCADtoGif = NULL;
    SaveCADtoJpeg = NULL;
    MessageBox(0, "CADImage.dll not loaded!", "Error", 0);
  }
}
//---------------------------------------------------------------------------

void __fastcall TfrmCADImageDLLdemo::Open1Click(TObject *Sender)
{
//  if (!OpenDialog1->Execute()) return;

//  if (CADHandle) CloseCAD(CADHandle);
//  CADHandle = CreateCAD(Application->Handle, OpenDialog1->FileName.c_str());
//  PaintBox1->Refresh();
}
//---------------------------------------------------------------------------
void __fastcall TfrmCADImageDLLdemo::FormDestroy(TObject *Sender)
{
  if (CADHandle) CloseCAD(CADHandle);
  if (CADImageDLL) FreeLibrary(CADImageDLL);
}
//---------------------------------------------------------------------------
void __fastcall TfrmCADImageDLLdemo::PaintBox1Paint(TObject *Sender)
{
  if ((CADHandle) && !bFileLoaded)
  {
//    int nDestOffX = 0;
//    int nDestOffY = 0;

    int nUnits;
    CADUnits(CADHandle,&nUnits);

    HDC hDC = GetDC(0);
    float horRes = 0;
    float vertRes = 0;
    if (nUnits == 1)
    {
      horRes = (float)GetDeviceCaps(hDC,HORZSIZE) / GetDeviceCaps(hDC,HORZRES);
      vertRes = (float)GetDeviceCaps(hDC,VERTSIZE) / GetDeviceCaps(hDC,VERTRES);
    }
    else
    {
      horRes = (float)GetDeviceCaps(hDC,HORZSIZE) / GetDeviceCaps(hDC,HORZRES) / 25.4;
      vertRes = (float)GetDeviceCaps(hDC,VERTSIZE) / GetDeviceCaps(hDC,VERTRES) / 25.4;
    }
    ReleaseDC(0, hDC);

    GetBoxCAD(CADHandle,&CADWidth, &CADHeight);

    float fCADSidesRatio = (float)CADWidth / CADHeight;
    float fDestRatio = (float)PaintBox1->ClientRect.Width() / (float)PaintBox1->ClientRect.Height();

    RECT rect;

    rect.left = 0;
    rect.top = 0;

    if (fDestRatio > fCADSidesRatio)
      rect.right = PaintBox1->ClientRect.Bottom * fCADSidesRatio;
    else
      rect.right = PaintBox1->ClientRect.Right;
    rect.bottom = rect.right / fCADSidesRatio;

    nScale = (float)ClientRect.Right/CADWidth * horRes;
    cbScale->Text = IntToStr(int(nScale * 100)) + "%";

    DrawCAD(CADHandle, PaintBox1->Canvas->Handle, &rect);
  }
  else
  {
   RefreshDrawing();
  }

}
//---------------------------------------------------------------------------
void __fastcall TfrmCADImageDLLdemo::tbOpenClick(TObject *Sender)
{
  int Cnt, i;
  char LayoutName[100];
  HANDLE Layout;
  if (!OpenDialog1->Execute()) return;

  if (CADHandle)
    CloseCAD(CADHandle);
  CADHandle = CreateCAD(Application->Handle, OpenDialog1->FileName.c_str());
  if (CADHandle != NULL)
{
  cbLayouts->Clear();
  Cnt = CADLayoutsCount(CADHandle);
  for ( i=0;i < Cnt;i++)
  {
    CADLayoutName(CADHandle, i, LayoutName, 100);
    Layout = CADLayout(CADHandle, i);
    cbLayouts->Items->AddObject(LayoutName, (TObject*)Layout);
  }
  cbLayouts->ItemIndex = DefaultLayoutIndex(CADHandle);
 }

  PaintBox1->Refresh();
  bFileLoaded = true;
  ProcessMenuItems(true);
}
//---------------------------------------------------------------------------


void __fastcall TfrmCADImageDLLdemo::cbScaleChange(TObject *Sender)
{
  AnsiString cScaleValue;

  cScaleValue = cbScale->Items->Strings[cbScale->ItemIndex];
  cScaleValue.Delete(cScaleValue.Length(), 1);

  nScale = (double)StrToFloat(cScaleValue)/100;
  RefreshDrawing();
}
//---------------------------------------------------------------------------

void __fastcall TfrmCADImageDLLdemo::mmiSaveAsClick(TObject *Sender)
{
  CADDRAW vCADDraw;
  char* vFileName;
  if (!SaveDialog1->Execute() || (!(bool)CADHandle && !bFileLoaded)) return;

//  if ((CADHandle) && !bFileLoaded)

  float vHorRes;
  float vVertRes;
  GetResolutionParams(&vHorRes, &vVertRes);

  vCADDraw.DC = PaintBox1->Canvas->Handle;
  vCADDraw.R.left = 0;
  vCADDraw.R.top = 0;
  vCADDraw.R.right = (int)CADWidth / vHorRes * nScale;
  vCADDraw.R.bottom = (int)CADHeight / vVertRes * nScale;
  vCADDraw.DrawMode = dmNormal;
  vCADDraw.Size = sizeof(vCADDraw);
  vFileName = SaveDialog1->FileName.c_str();

  switch (SaveDialog1->FilterIndex)
  {
    case 1:
      SaveCADtoBitmap(CADHandle, &vCADDraw, vFileName);
      break;
    case 2:
      SaveCADtoJpeg(CADHandle, &vCADDraw, vFileName);
      break;
    case 3:
      SaveCADtoGif(CADHandle, &vCADDraw, vFileName);
      break;
    default: return;
  }
}
//---------------------------------------------------------------------------

void TfrmCADImageDLLdemo::ProcessMenuItems(bool bEnable)
{
  mmiSaveAs->Enabled = bEnable;
  tbSave->Enabled = bEnable;
}

//---------------------------------------------------------------------------
void TfrmCADImageDLLdemo::RefreshDrawing()
{
  if (CADHandle)
  {
    float vHorRes, vVertRes;
    GetResolutionParams(&vHorRes, &vVertRes);

    GetBoxCAD(CADHandle,&CADWidth, &CADHeight);
    float fCADSidesRatio = (float)CADWidth / CADHeight;

    CADDRAW vCADDraw;

    vCADDraw.R.left = 0;//nDestOffX;
    vCADDraw.R.top = 0;//nDestOffY;
    vCADDraw.R.right = CADWidth / vHorRes * nScale;// + nDestOffX;
    vCADDraw.R.bottom = vCADDraw.R.right / fCADSidesRatio;// + nDestOffY;

    vCADDraw.DC = PaintBox1->Canvas->Handle;
    vCADDraw.DrawMode = dmNormal;
    vCADDraw.Size = sizeof(vCADDraw);

    TColor vColorBrush = PaintBox1->Canvas->Brush->Color;
    TBrushStyle vBrushStyle = PaintBox1->Canvas->Brush->Style;
    PaintBox1->Canvas->Brush->Color = PaintBox1->Color;
    PaintBox1->Canvas->Brush->Style = bsSolid;
    PaintBox1->Canvas->FillRect(PaintBox1->ClientRect);
    PaintBox1->Canvas->Brush->Color = vColorBrush;
    PaintBox1->Canvas->Brush->Style = vBrushStyle;
    DrawCADEx(CADHandle, &vCADDraw);
  }
}

//---------------------------------------------------------------------------

void __fastcall TfrmCADImageDLLdemo::FormMouseWheel(TObject *Sender,
      TShiftState Shift, int WheelDelta, TPoint &MousePos, bool &Handled)
{
  float prev_scale = nScale;

  if (nScale <= 0.1)
    nScale += (float)WheelDelta / 4800;
  else
    nScale += (float)WheelDelta / 1200;
  float fs = nScale / prev_scale;

//  nDestOffX = (int)((nDestOffX - MousePos.x) * abs(fs) + MousePos.x);
//  nDestOffY = (int)((nDestOffY - MousePos.y) * abs(fs) + MousePos.y);

  cbScale->Text = IntToStr(int(nScale * 100)) + "%";
  RefreshDrawing();
}
//---------------------------------------------------------------------------

void TfrmCADImageDLLdemo::GetResolutionParams(float* vHorRes, float* vVertRes)
{
    int nUnits;
    CADUnits(CADHandle,&nUnits);

    HDC hDC = GetDC(0);
    if (nUnits == 1)
    {
      *vHorRes = (float)GetDeviceCaps(hDC,HORZSIZE) / GetDeviceCaps(hDC,HORZRES);
      *vVertRes = (float)GetDeviceCaps(hDC,VERTSIZE) / GetDeviceCaps(hDC,VERTRES);
    }
    else
    {
      *vHorRes = (float)GetDeviceCaps(hDC,HORZSIZE) / GetDeviceCaps(hDC,HORZRES) / 25.4;
      *vVertRes = (float)GetDeviceCaps(hDC,VERTSIZE) / GetDeviceCaps(hDC,VERTRES) / 25.4;
    }
    ReleaseDC(0, hDC);
}
//---------------------------------------------------------------------------
void __fastcall TfrmCADImageDLLdemo::cbLayoutsCloseUp(TObject *Sender)
{
  if (cbLayouts->ItemIndex != -1)
  {
    CurrentLayoutCAD(CADHandle, cbLayouts->ItemIndex, True);
  }
  RefreshDrawing();
}
//---------------------------------------------------------------------------


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -