using System;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Colors;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
[assembly
: CommandClass
(typeof(NSASSOCHATCH
.MyCommands))]
namespace NSASSOCHATCH {
public class MyCommands {
[CommandMethod("NSASSOCHATCH")]
public static void AssocHatch() {
var doc =
Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager
.MdiActiveDocument;
var polyline
= new Polyline
();
using(var tx = doc.TransactionManager.StartTransaction()) {
polyline = CreatePolyline();
AddEntity(tx, doc.Database, polyline);
polyline.Layer = "0";
tx.Commit();
}
using(var tx = doc.TransactionManager.StartTransaction()) {
CreateHatch(doc, tx, polyline);
tx.Commit();
}
}
private static readonly EntityColor __color
= new EntityColor
(ColorMethod
.ByLayer,
256);
private static Hatch CreateHatch(Document doc, Transaction tx, Polyline boundary) {
// // ***revised
// h.SetHatchPattern(HatchPatternType.PreDefined, "ANGLE");
// h.HatchObjectType = HatchObjectType.HatchObject;
h.HatchObjectType = HatchObjectType.GradientObject;
//using ( var c = Color.FromEntityColor( __bgColor ) ) {
// h.BackgroundColor = c;
//}
h.SetGradient(GradientPatternType.PreDefinedGradient, "LINEAR");
// h.GradientAngle = 0;
h.GradientAngle = 0.0;
h.GradientOneColorMode = false;
h.GradientShift = 0;
h.HatchStyle = HatchStyle.Outer;
h
.Normal = new Vector3d
(0,
0,
1); h
.Origin = new Point2d
(0,
0);
// h.PatternAngle = 0; // ***revised
// h.PatternAngle = 0.0; // ***revised
// h.PatternDouble = false; // ***revised
// h.PatternScale = 1.0; // ***revised
// h.PatternSpace = 1.0; // ***revised
var gradientColors
= new GradientColor
[] { Color.FromColorIndex(ColorMethod.ByAci,5),0),
Color.FromColorIndex(ColorMethod.ByAci,2),1)
};
h.SetGradientColors(gradientColors);
// according to http://adndevblog.typepad.com/autocad/2012/07/hatch-using-the-autocad-net-api.html
// the pattern needs to be "reaffirmed"
// ***revised
// h.SetHatchPattern(HatchPatternType.PreDefined, "ANGLE");
// add to db before making hatch associative
AddEntity(tx, doc.Database, h);
h.Associative = true;
var boundaryColl
= new ObjectIdCollection
(new[] { boundary
.ObjectId }); // this call causes access violation
h.AppendLoop(
// ***revised HatchLoopTypes.Derived | HatchLoopTypes.Polyline |
// ***revised HatchLoopTypes.External,
HatchLoopTypes.Default,
boundaryColl);
h.EvaluateHatch(true);
return h;
}
private static Polyline CreatePolyline() {
var polyline
= new Polyline
(5); polyline
.Normal = new Vector3d
(0.0,
0.0,
1.0); // changing this to true does not help to the access violation
polyline.Closed = false;
using(var c = Color.FromEntityColor(__color)) {
polyline.Color = c;
}
var startPoint
= new Point2d
(-1689.42165011024,
992.835483259347);
polyline.AddVertexAt(0, startPoint, 0, 0, 0);
polyline.AddVertexAt(1,
new Point2d
(-551.330950840098,
109.713933732506),
0, 0, 0);
polyline.AddVertexAt(2,
new Point2d
(29.8217540440291,
1216.64025798278),
0, 0, 0);
polyline.AddVertexAt(3,
new Point2d
(1052.89265151563,
1313.42070640714),
0, 0, 0);
polyline.AddVertexAt(4, startPoint, 0, 0, 0);
polyline.MinimizeMemory();
return polyline;
}
private static ObjectId AddEntity(Transaction tx, Database db, Entity e) {
var btr =
(BlockTableRecord)
tx.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db),
OpenMode.ForWrite);
var oid = btr.AppendEntity(e);
e.SetDatabaseDefaults(db);
tx.AddNewlyCreatedDBObject(e, true);
return oid;
}
}
}