Sorry, somehow my reply I wrote for this seems to have vanished.
Reading and writing CTB is easy as could be by using the
// Read:
CtbFile ctb = new CtbFile("input.ctb");
// Write:
ctb.WriteTo("output.ctb");
During rendering usage of CTB is not supported. But you could add support for some features in one of two ways.
/// <summary>
/// Example for using different colors for some color indexes.
/// </summary>
public class IndexedColorExchanger {
private readonly IDictionary<short, ArgbColor> indexToColorMapping;
/// <summary>
/// Initializes a new instance of the <see cref="IndexedColorExchanger"/> class.
/// </summary>
/// <param name="colorMap">The color map, which only contains the colors indexes to be exchanged.</param>
public IndexedColorExchanger(IDictionary<short, ArgbColor> colorMap) {
indexToColorMapping = colorMap;
}
/// <summary>
/// Gets the plot style.
/// </summary>
/// <remarks>This method can be used as a <see cref="GraphicsConfig.PlotStyleManager"/>.</remarks>
/// <param name="plotPropertyOwner">The plot property owner (usually an entity).</param>
/// <param name="drawContext">The draw context.</param>
/// <returns>The plot style.</returns>
public IPlotStyle GetPlotStyle(IPlotPropertyOwner plotPropertyOwner, DrawContext drawContext) {
EntityColor entityColor = plotPropertyOwner.GetEntityColor(drawContext);
if (entityColor.ColorType == ColorType.ByColorIndex) {
ArgbColor substitutionColor;
if (indexToColorMapping.TryGetValue(entityColor.ColorIndex, out substitutionColor)) {
return new OverrideColorPlotStyle(substitutionColor, plotPropertyOwner, drawContext);
}
}
return new DefaultPlotStyle(plotPropertyOwner, drawContext);
}
}
/// <summary>
/// Plot manager class allowing to exchange line weights by color index.
/// </summary>
/// <remarks>
/// Use <see cref="ApplyLineWeightPlotting"/> how to prepare any
/// <see cref="GraphicsConfig"/> to use exchanged line weights.
/// </remarks>
public class LineWeightChanger {
private readonly IDictionary<short, short> indexToLineWeightMapping;
/// <summary>
/// Initializes a new instance of the <see cref="LineWeightChanger"/> class.
/// </summary>
/// <param name="indexToLineWeightMapping">
/// The exchanged line weights.
/// Keys are color indices, values are exchanged line weights in 100th of mm.
/// If a color index is not present in this map, the entity's effective line weight is taken.
/// </param>
public LineWeightChanger(IDictionary<short, short> indexToLineWeightMapping) {
this.indexToLineWeightMapping = indexToLineWeightMapping;
}
/// <summary>
/// Gets the plot style.
/// </summary>
/// <remarks>This method can be used as a <see cref="GraphicsConfig.PlotStyleManager"/>.</remarks>
/// <param name="plotPropertyOwner">The plot property owner (usually an entity).</param>
/// <param name="drawContext">The draw context.</param>
/// <returns>The plot style.</returns>
public IPlotStyle GetPlotStyle(IPlotPropertyOwner plotPropertyOwner, DrawContext drawContext) {
EntityColor entityColor = plotPropertyOwner.GetEntityColor(drawContext);
if (entityColor.ColorType == ColorType.ByColorIndex) {
short substitutionLineWeight;
if (indexToLineWeightMapping.TryGetValue(entityColor.ColorIndex, out substitutionLineWeight)) {
switch (substitutionLineWeight) {
case LineWeight.ByBlock:
substitutionLineWeight = drawContext.ByBlockLineWeight;
break;
case LineWeight.ByLayer:
DxfLayer layer = plotPropertyOwner.GetLayer(drawContext);
substitutionLineWeight = layer.GetLineWeight(drawContext.Config);
break;
case LineWeight.Standard:
substitutionLineWeight = drawContext.Config.DefaultLineWeight;
break;
}
return new OverrideLineWeightPlotStyle(substitutionLineWeight, plotPropertyOwner, drawContext);
}
}
return new DefaultPlotStyle(plotPropertyOwner, drawContext);
}
/// <summary>
/// Prepare a graphics configuration which uses line weight mapping.
/// </summary>
/// <param name="config">The graphics configuration, unchanged.</param>
/// <param name="indexToLineWeightMapping">Line weight mapping to use.</param>
/// <return>Clone of <paramref name="config"/>, prepared to exchange line weights.</return>
public static GraphicsConfig ApplyLineWeightPlotting(GraphicsConfig config, IDictionary<short, short> indexToLineWeightMapping) {
LineWeightChanger changer = new LineWeightChanger(indexToLineWeightMapping);
GraphicsConfig result = (GraphicsConfig)config.Clone();
result.PlotStyleManager = changer.GetPlotStyle;
return result;
}
}
Both classes can be easily adapted to use their information from the CTB file.
- Rammi