CadParamPluging/Cad/DrawingStyleManager.cs

190 lines
7.1 KiB
C#

using Autodesk.AutoCAD.Colors;
using Autodesk.AutoCAD.DatabaseServices;
namespace CadParamPluging.Cad
{
internal sealed class DrawingStyleManager
{
public enum Role
{
OutlineBold,
OutlineThin,
PartContour,
BreakLine, // 截断线(白色双点划线)
Centerline,
Hidden,
Hatch,
Dimension,
Text
}
private readonly Database _db;
private readonly Transaction _tr;
public DrawingStyleManager(Database db, Transaction tr)
{
_db = db;
_tr = tr;
}
public void Apply(Entity ent, Role role)
{
if (ent == null || _db == null || _tr == null)
{
return;
}
var spec = GetSpec(role);
EnsureLayer(spec.LayerName, spec.DefaultLinetypeName, spec.DefaultLineWeight, spec.DefaultColorIndex);
try { ent.Layer = spec.LayerName; } catch { }
try { ent.ColorIndex = 256; } catch { } // ByLayer
try { ent.Linetype = "ByLayer"; } catch { }
try { ent.LineWeight = LineWeight.ByLayer; } catch { }
}
private sealed class LayerSpec
{
public string LayerName { get; set; }
public string DefaultLinetypeName { get; set; }
public LineWeight DefaultLineWeight { get; set; }
public short DefaultColorIndex { get; set; }
}
private static LayerSpec GetSpec(Role role)
{
switch (role)
{
case Role.OutlineBold:
return new LayerSpec { LayerName = "粗实线", DefaultLinetypeName = "Continuous", DefaultLineWeight = LineWeight.LineWeight050, DefaultColorIndex = 7 };
case Role.PartContour:
return new LayerSpec { LayerName = "双点划线", DefaultLinetypeName = "PHANTOM", DefaultLineWeight = LineWeight.LineWeight015, DefaultColorIndex = 7 };
case Role.BreakLine:
return new LayerSpec { LayerName = "截断线", DefaultLinetypeName = "PHANTOM", DefaultLineWeight = LineWeight.LineWeight015, DefaultColorIndex = 7 };
case Role.Centerline:
return new LayerSpec { LayerName = "中心线", DefaultLinetypeName = "CENTER", DefaultLineWeight = LineWeight.LineWeight015, DefaultColorIndex = 7 };
case Role.Hidden:
return new LayerSpec { LayerName = "虚线", DefaultLinetypeName = "DASHED", DefaultLineWeight = LineWeight.LineWeight025, DefaultColorIndex = 7 };
case Role.Hatch:
return new LayerSpec { LayerName = "剖面线", DefaultLinetypeName = "Continuous", DefaultLineWeight = LineWeight.LineWeight015, DefaultColorIndex = 4 };
case Role.Dimension:
return new LayerSpec { LayerName = "尺寸标注", DefaultLinetypeName = "Continuous", DefaultLineWeight = LineWeight.LineWeight018, DefaultColorIndex = 3 };
case Role.Text:
return new LayerSpec { LayerName = "文字", DefaultLinetypeName = "Continuous", DefaultLineWeight = LineWeight.LineWeight018, DefaultColorIndex = 7 };
case Role.OutlineThin:
default:
return new LayerSpec { LayerName = "细实线", DefaultLinetypeName = "Continuous", DefaultLineWeight = LineWeight.LineWeight025, DefaultColorIndex = 7 };
}
}
private void EnsureLayer(string layerName, string linetypeName, LineWeight lineWeight, short colorIndex)
{
if (string.IsNullOrWhiteSpace(layerName) || _db == null || _tr == null)
{
return;
}
try
{
EnsureLinetype(linetypeName);
var layerTbl = (LayerTable)_tr.GetObject(_db.LayerTableId, OpenMode.ForRead);
if (layerTbl.Has(layerName))
{
try
{
var layerId = layerTbl[layerName];
var existingLayer = (LayerTableRecord)_tr.GetObject(layerId, OpenMode.ForWrite);
if (existingLayer != null)
{
// Make sure the layer is visible in the template.
existingLayer.IsOff = false;
existingLayer.IsFrozen = false;
existingLayer.IsLocked = false;
existingLayer.Color = Color.FromColorIndex(ColorMethod.ByAci, colorIndex);
existingLayer.LineWeight = lineWeight;
if (!string.IsNullOrWhiteSpace(linetypeName))
{
var lt = (LinetypeTable)_tr.GetObject(_db.LinetypeTableId, OpenMode.ForRead);
if (lt.Has(linetypeName))
{
existingLayer.LinetypeObjectId = lt[linetypeName];
}
}
}
}
catch
{
// ignore
}
return;
}
layerTbl.UpgradeOpen();
var ltr = new LayerTableRecord
{
Name = layerName,
Color = Color.FromColorIndex(ColorMethod.ByAci, colorIndex),
LineWeight = lineWeight
};
try
{
if (!string.IsNullOrWhiteSpace(linetypeName))
{
var lt = (LinetypeTable)_tr.GetObject(_db.LinetypeTableId, OpenMode.ForRead);
if (lt.Has(linetypeName))
{
ltr.LinetypeObjectId = lt[linetypeName];
}
}
}
catch
{
// ignore
}
layerTbl.Add(ltr);
_tr.AddNewlyCreatedDBObject(ltr, true);
}
catch
{
// ignore
}
}
private void EnsureLinetype(string linetypeName)
{
if (string.IsNullOrWhiteSpace(linetypeName) || _db == null || _tr == null)
{
return;
}
try
{
var lt = (LinetypeTable)_tr.GetObject(_db.LinetypeTableId, OpenMode.ForRead);
if (lt.Has(linetypeName))
{
return;
}
try
{
_db.LoadLineTypeFile(linetypeName, "acad.lin");
}
catch
{
// Some linetypes may not exist in acad.lin; ignore.
}
}
catch
{
// ignore
}
}
}
}