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