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
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; |
|
} |
|
} |
|
}
|
|
|