159 lines
5.5 KiB
C#
159 lines
5.5 KiB
C#
using Autodesk.AutoCAD.Colors;
|
|
using Autodesk.AutoCAD.DatabaseServices;
|
|
|
|
namespace CadParamPluging.Cad
|
|
{
|
|
internal sealed class DrawingStyleManager
|
|
{
|
|
public enum Role
|
|
{
|
|
OutlineBold,
|
|
OutlineThin,
|
|
PartContour,
|
|
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.LineWeight025, DefaultColorIndex = 7 };
|
|
case Role.Centerline:
|
|
return new LayerSpec { LayerName = "中心线", DefaultLinetypeName = "CENTER", DefaultLineWeight = LineWeight.LineWeight025, 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.LineWeight018, DefaultColorIndex = 7 };
|
|
case Role.Dimension:
|
|
return new LayerSpec { LayerName = "尺寸标注", DefaultLinetypeName = "Continuous", DefaultLineWeight = LineWeight.LineWeight018, DefaultColorIndex = 7 };
|
|
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))
|
|
{
|
|
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
|
|
}
|
|
}
|
|
}
|
|
}
|