年度变更建库软件5.0版本
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

249 lines
10 KiB

using System;
using System.Drawing;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geometry;
namespace KGIS.Plugin.LayerProperty.Utils
{
public class StyleGalleryItemView
{
private static IEnvelope Envelope4BatchDraw;
private static ITransformation Transformation4BatchDraw;
private static IGeometry Geometry4BatchDraw;
public static Bitmap StyleGalleryItemToBmp(int iWidth, int iHeight, IStyleGalleryClass mStyleGlyCs, IStyleGalleryItem mStyleGlyItem)
{
//if (mStyleGlyItem.Item is ISymbol)
//{
// return StyleGalleryItemView.SymbolToBitmap(iWidth, iHeight, mStyleGlyItem.Item as ISymbol);
//}
Bitmap bitmap = new Bitmap(iWidth, iHeight);
Graphics graphics = Graphics.FromImage(bitmap);
IntPtr hdc = IntPtr.Zero;
try
{
hdc = graphics.GetHdc();
}
catch
{
}
try
{
tagRECT tagRECT = default(tagRECT);
tagRECT.right = bitmap.Width;
tagRECT.bottom = bitmap.Height;
mStyleGlyCs.Preview(mStyleGlyItem.Item, hdc.ToInt32(), ref tagRECT);
if (hdc.ToInt32() != 0)
{
graphics.ReleaseHdc(hdc);
graphics.Dispose();
}
}
catch (Exception ex)
{
if (hdc.ToInt32() != 0)
{
graphics.ReleaseHdc(hdc);
graphics.Dispose();
}
//CoreUtil.AddException(ex);
}
return bitmap;
}
public static Bitmap SymbolToBitmap(int iWidth, int iHeight, ISymbol pSymbol)
{
StyleGalleryItemView.ResetBatchDraw();
Win32Util.InitBitmap(iWidth, iHeight);
StyleGalleryItemView.DrawSymbol(Win32Util.InnerDC, iWidth, iHeight, pSymbol, 2);
Bitmap bitmap = Win32Util.GetBitmap(iWidth, iHeight);
Win32Util.ReleaseDC();
return bitmap;
}
public static Bitmap StyleGalleryItemToBmp(int iHeight, IStyleGalleryClass mStyleGlyCs, IStyleGalleryItem mStyleGlyItem)
{
int iWidth = (int)(mStyleGlyCs.PreviewRatio * (double)iHeight);
return StyleGalleryItemView.StyleGalleryItemToBmp(iWidth, iHeight, mStyleGlyCs, mStyleGlyItem);
}
public static Bitmap GetSymbolBitMap(int width, int height, IStyleGalleryClass symbologyStyleClass, ISymbol pSymbol)
{
try
{
return StyleGalleryItemView.StyleGalleryItemToBmp(width, height, symbologyStyleClass, new ServerStyleGalleryItemClass
{
Item = pSymbol
});
}
catch (Exception ex)
{
//CoreUtil.AddException(ex);
}
return null;
}
public static Bitmap GetSymbolBitMap(int height, IStyleGalleryClass symbologyStyleClass, ISymbol pSymbol)
{
try
{
return StyleGalleryItemView.StyleGalleryItemToBmp(height, symbologyStyleClass, new ServerStyleGalleryItemClass
{
Item = pSymbol
});
}
catch (Exception ex)
{
//CoreUtil.AddException(ex);
}
return null;
}
public static Image CreatePictureFromSymbol(ISymbol pSymbol, double dblWidth, double dblHeight, double dblGap)
{
Bitmap bitmap = new Bitmap((int)dblWidth, (int)dblHeight);
Graphics graphics = Graphics.FromImage(bitmap);
IntPtr hdc = (IntPtr)0;
hdc = graphics.GetHdc();
StyleGalleryItemView.DrawToDC(hdc.ToInt32(), dblWidth, dblHeight, dblGap, pSymbol, false);
graphics.ReleaseHdc(hdc);
graphics.Dispose();
return bitmap;
}
public static Image CreatePictureFromSymbol(ISymbol pSymbol, double dblWidth, double dblHeight, double dblGap, bool blnLine)
{
Bitmap bitmap = new Bitmap((int)dblWidth, (int)dblHeight);
Graphics graphics = Graphics.FromImage(bitmap);
IntPtr hdc = (IntPtr)0;
hdc = graphics.GetHdc();
StyleGalleryItemView.DrawToDC(hdc.ToInt32(), dblWidth, dblHeight, dblGap, pSymbol, blnLine);
graphics.ReleaseHdc(hdc);
graphics.Dispose();
return bitmap;
}
private static void DrawToDC(int hDC, double dblWidth, double dblHeight, double dblGap, ISymbol pSymbol, bool blnLine)
{
IEnvelope envelope = new EnvelopeClass();
envelope.PutCoords(dblGap, dblGap, dblWidth - dblGap, dblHeight - dblGap);
ITransformation transformation = StyleGalleryItemView.CreateTransFromDC(hDC, dblWidth, dblHeight);
IGeometry geometry = StyleGalleryItemView.CreateSymShape(pSymbol, envelope, blnLine);
pSymbol.SetupDC(hDC, transformation);
pSymbol.Draw(geometry);
pSymbol.ResetDC();
}
private static ITransformation CreateTransFromDC(int hDC, double dblWidth, double dblHeight)
{
IEnvelope envelope = new EnvelopeClass();
envelope.PutCoords(0.0, 0.0, dblWidth, dblHeight);
tagRECT tagRECT = default(tagRECT);
tagRECT.left = 0;
tagRECT.top = 0;
tagRECT.right = (int)dblWidth;
tagRECT.bottom = (int)dblHeight;
return new DisplayTransformationClass
{
VisibleBounds = envelope,
Bounds = envelope,
//DeviceFrame = ref tagRECT,
Resolution = 96.0
};
}
private static IGeometry CreateSymShape(ISymbol pSymbol, IEnvelope pEnvelope, bool blnLine)
{
if (pSymbol is IMarkerSymbol)
{
IArea area = pEnvelope as IArea;
return area.Centroid;
}
if (!(pSymbol is ILineSymbol) && !(pSymbol is ITextSymbol))
{
return pEnvelope;
}
if (blnLine)
{
IPointCollection pointCollection = new PolylineClass();
IPoint point = new PointClass();
point.PutCoords(pEnvelope.XMin, pEnvelope.YMax);
object missing = Type.Missing;
pointCollection.AddPoint(point, ref missing, ref missing);
point = new PointClass();
point.PutCoords(pEnvelope.XMin + pEnvelope.Width / 3.0, pEnvelope.YMin);
missing = Type.Missing;
pointCollection.AddPoint(point, ref missing, ref missing);
point = new PointClass();
point.PutCoords(pEnvelope.XMax - pEnvelope.Width / 3.0, pEnvelope.YMax);
missing = Type.Missing;
pointCollection.AddPoint(point, ref missing, ref missing);
point = new PointClass();
point.PutCoords(pEnvelope.XMax, pEnvelope.YMin);
missing = Type.Missing;
pointCollection.AddPoint(point, ref missing, ref missing);
return pointCollection as IPolyline;
}
IPolyline polyline = new PolylineClass();
IPoint point2 = new PointClass();
point2.PutCoords(pEnvelope.XMin, pEnvelope.YMin + pEnvelope.Height / 2.0);
IPoint point3 = new PointClass();
point3.PutCoords(pEnvelope.XMax, pEnvelope.YMin + pEnvelope.Height / 2.0);
polyline.FromPoint = point2;
polyline.ToPoint = point3;
return polyline;
}
public static void ResetBatchDraw()
{
StyleGalleryItemView.Envelope4BatchDraw = null;
StyleGalleryItemView.Transformation4BatchDraw = null;
StyleGalleryItemView.Geometry4BatchDraw = null;
}
public static void DrawSymbol(int hDC, int w, int h, ISymbol pSymbol, int gap)
{
Win32Util.ClearDC(hDC, Color.Transparent, 0, 0, w, h);
if (StyleGalleryItemView.Envelope4BatchDraw == null)
{
StyleGalleryItemView.Envelope4BatchDraw = new EnvelopeClass();
}
StyleGalleryItemView.Envelope4BatchDraw.PutCoords((double)gap, (double)gap, (double)(w - gap), (double)(h - gap));
if (StyleGalleryItemView.Transformation4BatchDraw == null)
{
StyleGalleryItemView.Transformation4BatchDraw = StyleGalleryItemView.CreateTransFromDC(hDC, (double)w, (double)h);
}
if (StyleGalleryItemView.Geometry4BatchDraw == null)
{
StyleGalleryItemView.Geometry4BatchDraw = StyleGalleryItemView.CreateSymShape(pSymbol, StyleGalleryItemView.Envelope4BatchDraw);
}
try
{
if (pSymbol is ITextSymbol && pSymbol is ITextSymbol)
{
((ITextSymbol)pSymbol).Text = "AaBbYyZz";
}
pSymbol.SetupDC(hDC, StyleGalleryItemView.Transformation4BatchDraw);
pSymbol.Draw(StyleGalleryItemView.Geometry4BatchDraw);
}
catch (Exception value)
{
Console.Write(value);
}
finally
{
pSymbol.ResetDC();
}
}
private static IGeometry CreateSymShape(ISymbol pSymbol, IEnvelope pEnvelope)
{
if (pSymbol is IMarkerSymbol)
{
IArea area = (IArea)pEnvelope;
return area.Centroid;
}
if (pSymbol is ILineSymbol || pSymbol is ITextSymbol)
{
IPolyline polyline = (IPolyline)new PolylineClass();
IPoint point = new PointClass();
point.X = (pEnvelope.LowerLeft.X + pEnvelope.UpperLeft.X) / 2.0;
point.Y = (pEnvelope.LowerLeft.Y + pEnvelope.UpperLeft.Y) / 2.0;
polyline.FromPoint = point;
point.X = (pEnvelope.LowerRight.X + pEnvelope.UpperRight.X) / 2.0;
point.Y = (pEnvelope.LowerRight.Y + pEnvelope.UpperRight.Y) / 2.0;
polyline.ToPoint = point;
return polyline;
}
return pEnvelope;
}
}
}