Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion AltiumSharp/OriginalCircuit.AltiumSharp.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="OpenMcdf" Version="2.2.1.12" />
<PackageReference Include="OpenMcdf" Version="2.3.1" />
<PackageReference Include="System.Drawing.Common" Version="7.0.0" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="7.0.0" />
</ItemGroup>
Expand Down
4 changes: 4 additions & 0 deletions AltiumSharp/Records/Sch/SchPin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,10 @@ public TextOrientations Orientation
.WithFlag(PinConglomerateFlags.Flipped, value.HasFlag(TextOrientations.Flipped));
}

public IList<string> Functions { get; } = new List<string>();

public IList<string> SelectedFunctions { get; } = new List<string>();

public SchPin() : base()
{
Electrical = PinElectricalType.Passive;
Expand Down
2 changes: 1 addition & 1 deletion AltiumSharp/SchDocReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ private void ReadFileHeader()
var parameters = ReadBlock(reader, size => ReadParameters(reader, size));
var weight = parameters["WEIGHT"].AsIntOrDefault();

var primitives = ReadPrimitives(reader, null, null, null, null);
var primitives = ReadPrimitives(reader, null, null, null, null, null);
Data.Items.AddRange(primitives);

AssignOwners(primitives);
Expand Down
2 changes: 1 addition & 1 deletion AltiumSharp/SchDocWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ private void WritePrimitives(BinaryWriter writer)
var index = 0;
var pinIndex = 0;
WritePrimitive(writer, Data.Header, false, 0, ref index, ref pinIndex,
null, null, null, null);
null, null, null, null, null);
}

private void WriteAdditional()
Expand Down
41 changes: 40 additions & 1 deletion AltiumSharp/SchLibReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,10 +126,11 @@ private SchComponent ReadComponent(string resourceName)
var pinsWideText = ReadPinWideText(componentStorage);
var pinsTextData = ReadPinTextData(componentStorage);
var pinsSymbolLineWidth = ReadPinSymbolLineWidth(componentStorage);
var pinsFunctionData = ReadPinFunctionData(componentStorage);

using (var reader = componentStorage.GetStream("Data").GetBinaryReader())
{
var primitives = ReadPrimitives(reader, pinsFrac, pinsWideText, pinsTextData, pinsSymbolLineWidth).ToList();
var primitives = ReadPrimitives(reader, pinsFrac, pinsWideText, pinsTextData, pinsSymbolLineWidth, pinsFunctionData).ToList();

// First primitive read must be the component SchComponent
var component = (SchComponent)primitives.First();
Expand Down Expand Up @@ -282,5 +283,43 @@ private Dictionary<int, ParameterCollection> ReadPinSymbolLineWidth(CFStorage co

return result;
}

/// <summary>
/// Reads a pin function data for the component at <paramref name="componentStorage"/>.
/// </summary>
private Dictionary<int, ParameterCollection> ReadPinFunctionData(CFStorage componentStorage)
{
if (!componentStorage.TryGetStream("PinFunctionData", out var storage)) return null;

BeginContext("PinFunctionData");

var result = new Dictionary<int, ParameterCollection>();
using (var reader = storage.GetBinaryReader())
{
var headerParams = ReadBlock(reader, size => ReadParameters(reader, size));
var header = headerParams["HEADER"].AsStringOrDefault();
var weight = headerParams["WEIGHT"].AsIntOrDefault();
AssertValue(nameof(header), header, "PinFunctionData");

while (reader.BaseStream.Position < reader.BaseStream.Length)
{
var (id, parameters) = ReadCompressedStorage(reader, stream =>
{
using (var r = new BinaryReader(stream))
{
return ReadBlock(r, s => ReadParameters(r, s, true, Encoding.Unicode));
}
});
var count = parameters["PINDEFINEDFUNCTIONSCOUNT"].AsIntOrDefault();
CheckValue(nameof(count), count, parameters.Count - 1);
result.Add(int.Parse(id, CultureInfo.InvariantCulture), parameters);
}
CheckValue(nameof(weight), weight, result.Count);
}

EndContext();

return result;
}
}
}
9 changes: 6 additions & 3 deletions AltiumSharp/SchLibWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,27 +95,30 @@ private void WriteComponent(SchComponent component)
var pinsWideText = new Dictionary<int, ParameterCollection>();
var pinsTextData = new Dictionary<int, byte[]>();
var pinsSymbolLineWidth = new Dictionary<int, ParameterCollection>();
var pinsFunctionData = new Dictionary<int, ParameterCollection>();

componentStorage.GetOrAddStream("Data").Write(writer =>
{
WriteComponentPrimitives(writer, component, pinsFrac, pinsWideText, pinsTextData, pinsSymbolLineWidth);
WriteComponentPrimitives(writer, component, pinsFrac, pinsWideText, pinsTextData, pinsSymbolLineWidth, pinsFunctionData);
});

WritePinFrac(componentStorage, pinsFrac);
WritePinTextData(componentStorage, pinsTextData);
WriteComponentExtendedParameters(componentStorage, "PinWideText", pinsWideText);
WriteComponentExtendedParameters(componentStorage, "PinSymbolLineWidth", pinsSymbolLineWidth);
WriteComponentExtendedParameters(componentStorage, "PinFunctionData", pinsFunctionData);
}

private static void WriteComponentPrimitives(BinaryWriter writer, SchComponent component,
Dictionary<int, (int x, int y, int length)> pinsFrac,
Dictionary<int, ParameterCollection> pinsWideText, Dictionary<int, byte[]> pinsTextData,
Dictionary<int, ParameterCollection> pinsSymbolLineWidth)
Dictionary<int, ParameterCollection> pinsSymbolLineWidth,
Dictionary<int, ParameterCollection> pinsFunctionData)
{
var index = 0;
var pinIndex = 0;
WritePrimitive(writer, component, true, 0, ref index, ref pinIndex,
pinsFrac, pinsWideText, pinsTextData, pinsSymbolLineWidth);
pinsFrac, pinsWideText, pinsTextData, pinsSymbolLineWidth, pinsFunctionData);
}

/// <summary>
Expand Down
23 changes: 20 additions & 3 deletions AltiumSharp/SchReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ protected IDictionary<string, Image> ReadStorageEmbeddedImages()
protected List<SchPrimitive> ReadPrimitives(BinaryReader reader,
Dictionary<int, (int x, int y, int length)> pinsFrac,
Dictionary<int, ParameterCollection> pinsWideText, Dictionary<int, byte[]> pinsTextData,
Dictionary<int, ParameterCollection> pinsSymbolLineWidth)
Dictionary<int, ParameterCollection> pinsSymbolLineWidth,
Dictionary<int, ParameterCollection> pinsFunctionData)
{
if (reader == null)
throw new ArgumentNullException(nameof(reader));
Expand All @@ -89,12 +90,14 @@ protected List<SchPrimitive> ReadPrimitives(BinaryReader reader,
ParameterCollection pinWideText = null;
byte[] pinTextData = null;
ParameterCollection pinSymbolLineWidth = null;
ParameterCollection pinFunctionData = null;
pinsFrac?.TryGetValue(pinIndex, out pinFrac);
pinsWideText?.TryGetValue(pinIndex, out pinWideText);
pinsTextData?.TryGetValue(pinIndex, out pinTextData);
pinsSymbolLineWidth?.TryGetValue(pinIndex, out pinSymbolLineWidth);
pinsFunctionData?.TryGetValue(pinIndex, out pinFunctionData);
pinIndex++;
return ReadPinRecord(reader, size, pinFrac, pinWideText, pinTextData, pinSymbolLineWidth);
return ReadPinRecord(reader, size, pinFrac, pinWideText, pinTextData, pinSymbolLineWidth, pinFunctionData);
});
primitive.SetRawData(ExtractStreamData(reader, primitiveStartPosition, reader.BaseStream.Position));
primitives.Add(primitive);
Expand Down Expand Up @@ -274,7 +277,7 @@ protected static T ReadRecord<T>(BinaryReader reader,
}

protected SchPin ReadPinRecord(BinaryReader reader, int size, (int x, int y, int length) pinFrac,
ParameterCollection pinWideText, byte[] pinTextData, ParameterCollection pinSymbolLineWidth)
ParameterCollection pinWideText, byte[] pinTextData, ParameterCollection pinSymbolLineWidth, ParameterCollection pinFunctionData)
{
if (reader == null)
throw new ArgumentNullException(nameof(reader));
Expand Down Expand Up @@ -332,6 +335,20 @@ protected SchPin ReadPinRecord(BinaryReader reader, int size, (int x, int y, int
pin.SymbolLineWidth = pinSymbolLineWidth["SYMBOL_LINEWIDTH"].AsEnumOrDefault(pin.SymbolLineWidth);
}

if (pinFunctionData?.Count > 0)
{
var pinDefinedFunctionsCount = pinFunctionData[0].Value.AsInt();
for (int i = 1; i < pinFunctionData.Count; i++)
{
pin.Functions.Add(pinFunctionData[i].Value.AsString());
}

if (pin.Functions.Count != pinDefinedFunctionsCount)
{
EmitWarning($"Pin function count mismatch: {pin.Functions.Count} != {pinDefinedFunctionsCount}");
}
}

EndContext();

return pin;
Expand Down
56 changes: 52 additions & 4 deletions AltiumSharp/SchWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,19 +64,22 @@ protected static void WritePrimitive(BinaryWriter writer, SchPrimitive primitive
int ownerIndex, ref int index, ref int pinIndex,
Dictionary<int, (int x, int y, int length)> pinsFrac,
Dictionary<int, ParameterCollection> pinsWideText, Dictionary<int, byte[]> pinsTextData,
Dictionary<int, ParameterCollection> pinsSymbolLineWidth)
Dictionary<int, ParameterCollection> pinsSymbolLineWidth, Dictionary<int, ParameterCollection> pinsFunctionData)
{
if (primitive == null)
throw new ArgumentNullException(nameof(primitive));

if (pinsSymbolLineWidth == null)
throw new ArgumentNullException(nameof(pinsSymbolLineWidth));

if (pinsFunctionData == null)
throw new ArgumentNullException(nameof(pinsFunctionData));

primitive.OwnerIndex = ownerIndex;

if (pinAsBinary && primitive is SchPin pin)
{
WritePinRecord(writer, pin, out var pinFrac, out var pinWideText, out var pinTextData, out var pinSymbolLineWidth);
WritePinRecord(writer, pin, out var pinFrac, out var pinWideText, out var pinTextData, out var pinSymbolLineWidth, out var pinFunctionData);

if (pinFrac.x != 0 || pinFrac.y != 0 || pinFrac.length != 0)
{
Expand All @@ -94,6 +97,10 @@ protected static void WritePrimitive(BinaryWriter writer, SchPrimitive primitive
{
pinsSymbolLineWidth.Add(pinIndex, pinSymbolLineWidth);
}
if (pinFunctionData?.Count > 0)
{
pinsFunctionData.Add(pinIndex, pinFunctionData);
}

pinIndex++;
}
Expand All @@ -107,7 +114,7 @@ protected static void WritePrimitive(BinaryWriter writer, SchPrimitive primitive
foreach (var child in primitive.GetAllPrimitives())
{
WritePrimitive(writer, child, pinAsBinary, currentIndex, ref index, ref pinIndex,
pinsFrac, pinsWideText, pinsTextData, pinsSymbolLineWidth);
pinsFrac, pinsWideText, pinsTextData, pinsSymbolLineWidth, pinsFunctionData);
}
}

Expand Down Expand Up @@ -136,7 +143,8 @@ protected static void WriteAsciiRecord(BinaryWriter writer, SchPrimitive primiti
/// <param name="writer">Binary writer.</param>
/// <param name="pin">Pin primitive to be serialized as a record.</param>
protected static void WritePinRecord(BinaryWriter writer, SchPin pin, out (int x, int y, int length) pinFrac,
out ParameterCollection pinWideText, out byte[] pinTextData, out ParameterCollection pinSymbolLineWidth)
out ParameterCollection pinWideText, out byte[] pinTextData, out ParameterCollection pinSymbolLineWidth,
out ParameterCollection pinFunctionData)
{
if (pin == null)
throw new ArgumentNullException(nameof(pin));
Expand Down Expand Up @@ -194,6 +202,46 @@ protected static void WritePinRecord(BinaryWriter writer, SchPin pin, out (int x
{
{ "SYMBOL_LINEWIDTH", pin.SymbolLineWidth }
};

pinFunctionData = new ParameterCollection();

var hash = new HashSet<string>();

if (pin.SelectedFunctions.Count > 0)
{
var pinHash = new HashSet<string>(pin.Functions);

pinFunctionData.Add("PINSELECTEDFUNCTIONSCOUNT", pin.SelectedFunctions.Count);

for (int i = 0; i < pin.SelectedFunctions.Count; i++)
{
var selectedFunction = pin.SelectedFunctions[i];
if (!pinHash.Contains(selectedFunction) || !hash.Add(selectedFunction))
{
throw new NotSupportedException();
}

pinFunctionData.Add($"PINSELECTEDFUNCTION{i + 1}", selectedFunction);
}
}

if (pin.Functions.Count > 0)
{
pinFunctionData.Add("PINDEFINEDFUNCTIONSCOUNT", pin.Functions.Count);

hash.Clear();

for (int i = 0; i < pin.Functions.Count; i++)
{
var function = pin.Functions[i];
if (!hash.Add(function))
{
throw new NotSupportedException();
}

pinFunctionData.Add($"PINDEFINEDFUNCTION{i + 1}", function);
}
}
}
}
}
2 changes: 1 addition & 1 deletion LibraryViewer/LibraryViewer.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="OpenMcdf" Version="2.2.1.6" />
<PackageReference Include="OpenMcdf" Version="2.3.1" />
<PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" />
<PackageReference Include="Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers" Version="0.4.355802">
<PrivateAssets>all</PrivateAssets>
Expand Down