using Autodesk.AutoCAD.Colors; using Autodesk.AutoCAD.DatabaseServices; namespace CadParamPluging.Cad { internal sealed class DrawingStyleManager { private const string BreakLineLinetypeName = "BREAK_THREE_SHORT_V2"; 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 { } if (role == Role.BreakLine) { try { ent.Linetype = BreakLineLinetypeName; } 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 = BreakLineLinetypeName, 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; } if (linetypeName == BreakLineLinetypeName) { lt.UpgradeOpen(); var record = new LinetypeTableRecord { Name = BreakLineLinetypeName, AsciiDescription = "Long dash, three short dashes", PatternLength = 1.68, NumDashes = 8 }; record.SetDashLengthAt(0, 0.6); record.SetDashLengthAt(1, -0.18); record.SetDashLengthAt(2, 0.12); record.SetDashLengthAt(3, -0.18); record.SetDashLengthAt(4, 0.12); record.SetDashLengthAt(5, -0.18); record.SetDashLengthAt(6, 0.12); record.SetDashLengthAt(7, -0.18); lt.Add(record); _tr.AddNewlyCreatedDBObject(record, true); return; } try { _db.LoadLineTypeFile(linetypeName, "acad.lin"); } catch { // Some linetypes may not exist in acad.lin; ignore. } } catch { // ignore } } } }