愛伊米

C#在AutoCAD中實現批量出圖(一)——自動計算列印比例尺

依比例

使打印出來的圖形按照圖面標記的比例放大後,地物或實體的長度與實際長度一致(在量測誤差範圍內),稱之為“依比例”。

如下圖所示:

C#在AutoCAD中實現批量出圖(一)——自動計算列印比例尺

列印後的圖紙量算長度(單位:釐米)及列印比例尺(右下角)

C#在AutoCAD中實現批量出圖(一)——自動計算列印比例尺

房屋邊長圖面實際長度(單位:米)

C#在AutoCAD中實現批量出圖(一)——自動計算列印比例尺

在傾斜模型上量取的邊長(單位:米)

透過以上三張圖的對比可以看出,列印後圖紙的長度和實際長度基本符合給定比例尺的縮放比例(考慮尺子的精度及人眼分辨的精度)。

計算比例尺

那麼,我們如何才能精確計算出需要列印到多大的比例尺呢?

1、首先要確定我們出圖的紙張大小,以A4紙為例,紙張大小為:210。00 x 297。00 (mm)。

2、如果列印需要製作一個圖框,那我們就需要按照A4紙張的大小製作一個列印圖框(後面章節會介紹如何製作圖框),我們假定出圖列印的時候預設比例尺為1:1000,那麼按照A4紙張的大小,我們的圖框大小應該為:寬:210*1000=210000mm=210m;高:297*1000=297000mm=297m。

3、為了確保圖紙列印後能以一個適中的大小佔滿紙張的區域,那麼我們就需要計算圖面的地物實體(比如“房屋、道路”等)放到圖紙上的縮放比例。我們剛才假定了,如果不縮放,直接將圖形放到圖框內列印到圖紙上的預設比例是:1:1000。如下圖:

C#在AutoCAD中實現批量出圖(一)——自動計算列印比例尺

按照1:1000的比例將圖形直接放到圖紙後的效果

4、為了保證圖面美觀,我們需要將列印後的圖形調整到圖紙填充相對飽滿的程度,現在有兩種方法可以使用

(1):放大圖形,以將圖面填充飽滿;

(2):縮小圖框,以將圖框大小適合圖形大小。

這個教程中,我們選擇方法(2),對圖框大小進行縮放。

5、計算縮放比例將是我們在縮放圖框之前需要進行的關鍵工作:

(1):先獲取到列印圖形的外包矩形,並獲取矩形的寬和高;

(2):分別計算scaleW=圖形寬/圖紙寬;scaleH=圖形高/圖紙高;

(3):取scaleW和scaleH兩個值中的大值作為圖紙縮放的比例;

(4):為了確保我們輸出的圖形比例尺分母為特定數字的整數倍(比如:50的整數倍,比例尺分別為“1:50,1:100,1:150,1:200……”)我們將比例尺引數與想要的數字相除之後向上取整(以確保所有圖形都能列印到圖紙空間,不至於超出圖紙);

(5):輸出計算後的比例尺。

程式實現

///

/// 獲取列印縮放比例尺

///

/// 泛型類

/// 左下角最小點

/// 右上角最大點

/// 紙張空間寬度

/// 紙張空間高度

/// 縮放倍數

/// 最大縮放比例尺

public static void GetScaleValue(T minpt, T maxpt,double paperW,double paperH,double ScalePar,double maxScale)

{

double L = 0, W = 0;

if (typeof(T) == typeof(Point3d))

{

Point3d minPoint = (Point3d)Convert。ChangeType(minpt, typeof(Point3d));

Point3d maxPoint = (Point3d)Convert。ChangeType(maxpt, typeof(Point3d));

L = maxPoint。Y - minPoint。Y;

W = maxPoint。X - minPoint。X;

}

else if (typeof(T) == typeof(double[]))

{

double[] minPoint = (double[])Convert。ChangeType(minpt, typeof(double[]));

double[] maxPoint = (double[])Convert。ChangeType(maxpt, typeof(double[]));

L = maxPoint[1] - minPoint[1];

W = maxPoint[0] - minPoint[0];

}

double hPar = L / paperH;

double wPar = W / paperW;

double max = maxScale/ 1000。0;

double sPar = ScalePar / 1000。0;

if(hPar

{

ScaleVal = max ;

BLCStr = $“1:”;

}

else

{

if (hPar > wPar)

{

ScaleVal=Math。Ceiling(hPar / sPar) * sPar;

BLCStr = $“1:”;

}

else

{

ScaleVal = Math。Ceiling(wPar / sPar) * sPar;

BLCStr = $“1:”;

}

}

}