This commit is contained in:
694
trunk/ulp/bom.ulp
Normal file
694
trunk/ulp/bom.ulp
Normal file
@@ -0,0 +1,694 @@
|
||||
#require 6.5100
|
||||
|
||||
// Revision history:
|
||||
//
|
||||
// 1.00
|
||||
// - Initial release
|
||||
//
|
||||
// 1.01
|
||||
// - Dialog mask for text or html output selection corrected
|
||||
//
|
||||
// 1.02
|
||||
// - CSV export added after a suggestion of Christian Schlittler
|
||||
// - File extension for text file output changed from .bom to .txt
|
||||
//
|
||||
// 1.03
|
||||
// - Added missing description column in value mode.
|
||||
//
|
||||
// 1.04
|
||||
// - List also Packages bei Value
|
||||
//
|
||||
// 1.05
|
||||
// - 2012-03-01 change PartValue[], PartDevice[], PartPackage[], PartHeadline[], PartDescription[] to normal string. alf@cadsoft.de
|
||||
// numeric strings with only numericasl characters, sorts up to 8 characters!
|
||||
//
|
||||
// 1.06
|
||||
// - 2012-05-25 support now populated variants
|
||||
// switch on/off attributes
|
||||
// is now the standard bom.ulp alf@cadsoft.de
|
||||
//
|
||||
// 1.07
|
||||
// - 2012-06-22 set correct variant
|
||||
//
|
||||
// 1.08
|
||||
// - 2012-11-08 list different values of attributes
|
||||
//
|
||||
// 1.09
|
||||
// - 2012-12-04 now can change the separator character for CSV files.
|
||||
// change the character in line Separator = ',';
|
||||
//
|
||||
// 1.10
|
||||
// - 2014-08-07 extended to V7 hierarchical schematic
|
||||
//
|
||||
// Revision: 1.10
|
||||
//
|
||||
|
||||
string Version = "1.10";
|
||||
|
||||
char Separator = ';'; // 2012-12-04
|
||||
|
||||
|
||||
#usage "en: <b>Export a Bill Of Material</b>\n"
|
||||
"<p>"
|
||||
"Generates a project's <i>Bill Of Material</i> including the attributes introduced in"
|
||||
" version 5.0.0."
|
||||
"<p>"
|
||||
"<author>Author: support@cadsoft.de</author><br>"
|
||||
"<author>Modified to use the new attributes by Carsten Wille.</author><br>"
|
||||
"<author>.csv export added by Christian Schlittler.</author>"
|
||||
"<author>Select variant and switch on/off attributes alf@cadsoft.de</author>",
|
||||
"de: <b>Stückliste exportieren</b>\n"
|
||||
"<p>"
|
||||
"Erzeugt die <i>Stückliste</i> (Bill Of Material) eines Projekts, einschließlich der"
|
||||
" mit Version 5.0.0 neu eingeführten Attribute."
|
||||
"<p>"
|
||||
"<author>Autor: support@cadsoft.de</author><br>"
|
||||
"<author>Modifiziert von Carsten Wille, um die neuen Attribute zu nutzen.</author><br>"
|
||||
"<author>Export als .csv-Datei durch Christian Schlittler hinzugefügt.</author>"
|
||||
"<author>Auswählen von Bestückungs-Varianten und Attribute können ein/ausgeschaltet werden alf@cadsoft.de</author>"
|
||||
|
||||
// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED
|
||||
|
||||
string HelpTextEN =
|
||||
"<b>How to generate the Bill Of Material</b>\n"
|
||||
"<p>\n"
|
||||
"<b>List type</b>\n"
|
||||
"<p>\n"
|
||||
"The <i>Bill Of Material</i> can be generated either as a list\n"
|
||||
"of parts (where every part is listed on a line of its own),\n"
|
||||
"or as a list of values, where all parts with the same value are grouped\n"
|
||||
"together in one line. Use the <b><u>P</u>arts</b> and <b><u>V</u>alues</b>\n"
|
||||
"radio buttons to select the list type.\n"
|
||||
"<p>\n"
|
||||
"<b>Output format</b>\n"
|
||||
"<p>\n"
|
||||
"Choose between pure ASCII <b><u>T</u>ext</b> format, <b><u>C</u>SV</b> or <b><u>H</u>TML</b>.\n"
|
||||
;
|
||||
|
||||
string HelpTextDE =
|
||||
"<b>Erzeugen der Stückliste</b>\n"
|
||||
"<p>\n"
|
||||
"<b>Listen-Typ</b>\n"
|
||||
"<p>\n"
|
||||
"Die <i>Stückliste</i> kann entweder als Liste der Bauteile generiert werden\n"
|
||||
"(wobei jedes Bauteil in einer eigenen Zeile aufgeführt wird),\n"
|
||||
"oder als Liste der Werte, wobei alle Bauteile mit dem gleichen Wert in einer Zeile\n"
|
||||
"zusammengefasst werden. Mit den Radio-Buttons <b><u>B</u>auteile</b> und <b><u>W</u>erte</b>\n"
|
||||
"kann zwischen den beiden Listen-Typen gewählt werden.\n"
|
||||
"<p>\n"
|
||||
"<b>Ausgabeformat</b>\n"
|
||||
"<p>\n"
|
||||
"Wählen Sie zwischen reinem ASCII-<b><u>T</u>ext</b>, <b><u>C</u>SV</b> oder <b><u>H</u>TML</b>"
|
||||
"-Format.\n"
|
||||
;
|
||||
|
||||
string I18N[] = {
|
||||
"en\v"
|
||||
"de\v"
|
||||
,
|
||||
"<hr><b>ERROR: No schematic!</b><p>\nThis program can only work in the schematic editor.\v"
|
||||
"<hr><b>FEHLER: Kein Schaltplan!</b><p>\nDieses Programm kann nur in einem Schaltplan verwendet"
|
||||
" werden.\v"
|
||||
,
|
||||
"Part\tValue\tDevice\tPackage\tDescription\v"
|
||||
"Bauteil\tWert\tDevice\tPackage\tDescription\v"
|
||||
,
|
||||
"Qty\tValue\tDevice\tPackage\tParts\v" // 2011-04-08
|
||||
"Menge\tWert\tDevice\tGehäuse\tBauteile\v" // 2011-04-08
|
||||
,
|
||||
"Partlist exported from %s at %s\v"
|
||||
"Stückliste exportiert aus %s am %s\v"
|
||||
,
|
||||
"Bill Of Material - Preview\v"
|
||||
"Stückliste - Vorschau\v"
|
||||
,
|
||||
"-Close\v"
|
||||
"-Schließen\v"
|
||||
,
|
||||
"Save Bill Of Material\v"
|
||||
"Stückliste speichern\v"
|
||||
,
|
||||
"File '\v"
|
||||
"Datei '\v"
|
||||
,
|
||||
"' exists\n\nOverwrite?\v"
|
||||
"' existiert\n\nÜberschreiben?\v"
|
||||
,
|
||||
"+&Yes\v"
|
||||
"+&Ja\v"
|
||||
,
|
||||
"-&No\v"
|
||||
"-&Nein\v"
|
||||
,
|
||||
"&No\v"
|
||||
"&Nein\v"
|
||||
,
|
||||
"Name already defined!\v"
|
||||
"Name ist bereits definiert!\v"
|
||||
,
|
||||
" Header\v"
|
||||
" Spaltenüberschrift\v"
|
||||
,
|
||||
"&Name:\v"
|
||||
"&Name:\v"
|
||||
,
|
||||
"+OK\v"
|
||||
"+OK\v"
|
||||
,
|
||||
"Name can't be empty!\v"
|
||||
"Name kann nicht leer sein!\v"
|
||||
,
|
||||
"-Cancel\v"
|
||||
"-Abbrechen\v"
|
||||
,
|
||||
"&Headers\v"
|
||||
"&Spaltenüberschriften\v"
|
||||
,
|
||||
"Bill Of Material - Help\v"
|
||||
"Stückliste - Hilfe\v"
|
||||
,
|
||||
"Bill Of Material\v"
|
||||
"Stückliste\v"
|
||||
,
|
||||
"List type\v"
|
||||
"Listen-Typ\v"
|
||||
,
|
||||
"&Parts\v"
|
||||
"&Bauteile\v"
|
||||
,
|
||||
"&Values\v"
|
||||
"&Werte\v"
|
||||
,
|
||||
"Output format\v"
|
||||
"Ausgabeformat\v"
|
||||
,
|
||||
"&Text\v"
|
||||
"&Text\v"
|
||||
,
|
||||
"&CSV\v"
|
||||
"&CSV\v"
|
||||
,
|
||||
"&HTML\v"
|
||||
"&HTML\v"
|
||||
,
|
||||
"+Vie&w\v"
|
||||
"+&Vorschau\v"
|
||||
,
|
||||
"&Save...\v"
|
||||
"&Speichern...\v"
|
||||
,
|
||||
"H&elp\v"
|
||||
"H&ilfe\v"
|
||||
,
|
||||
"Current &variant \v"
|
||||
"Aktuelle &Variante \v"
|
||||
,
|
||||
"List &attributes\v"
|
||||
"&Attribute auflisten\v"
|
||||
};
|
||||
int Language = strstr (I18N [0], language ()) / 3;
|
||||
|
||||
|
||||
string tr (string s)
|
||||
{
|
||||
string t = lookup (I18N, s, Language, '\v');
|
||||
return t ? t : s;
|
||||
}
|
||||
|
||||
|
||||
if (!schematic)
|
||||
{
|
||||
dlgMessageBox (usage + tr ("<hr><b>ERROR: No schematic!</b><p>\nThis program can only work in"
|
||||
" the schematic editor."));
|
||||
exit (1);
|
||||
}
|
||||
|
||||
string SeparatorString;
|
||||
int NumParts;
|
||||
numeric string Lines[];
|
||||
numeric string PartName[];
|
||||
string PartValue[], PartDevice[], PartPackage[], PartHeadline[];
|
||||
numeric string PartDescription [];
|
||||
int PartValueOn[];
|
||||
int Selected;
|
||||
|
||||
string CurrentVariant = "";
|
||||
string Variants[] = { "" }; // 2012-04-16
|
||||
int cntVD = 0;
|
||||
int VDsel = 0;
|
||||
|
||||
|
||||
// cwi: Added arrays for an arbitraty number of attributes.
|
||||
int UseAttributes = 1;
|
||||
int FoundAttributes = 0; // # of different attribute names found in schematic.
|
||||
numeric string AttributesList[]; // Sorted list of all attributes found in the schematic.
|
||||
numeric string PartAttributes[]; // Adjusted list of attributes per part.
|
||||
|
||||
enum { ltParts, ltValues }; // List Types
|
||||
enum { ofText, ofCSV, ofHTML }; // Output Formats
|
||||
int ListType = 0;
|
||||
int OutputFormat = 0;
|
||||
|
||||
|
||||
string StripWhiteSpace (string s)
|
||||
{
|
||||
while (s && isspace (s[0]))
|
||||
s = strsub (s, 1);
|
||||
while (s && isspace (s[strlen (s) - 1]))
|
||||
s = strsub (s, 0, strlen (s) - 1);
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
// Collect part data from the schematic.
|
||||
//
|
||||
// Arguments: -
|
||||
//
|
||||
// Returns: NumParts - # of found parts
|
||||
// ParteName[]
|
||||
// PartValue[]
|
||||
// PartDevice[]
|
||||
// PartPackage[]
|
||||
// PartHeadline[]
|
||||
// PartDescription []
|
||||
// PartValueOn[] - 0=part value off, 1= part value on, 2=override with attr. VAL
|
||||
// FoundAttributes - # of different attribute names found in schematic.
|
||||
// AttributesList[] - Sorted list of all attributes found in the schematic.
|
||||
// PartAttributes[] - Adjusted list of attributes per part.
|
||||
|
||||
void CollectPartData (string var)
|
||||
{
|
||||
int Found = 0;
|
||||
int i;
|
||||
string attr[];
|
||||
|
||||
NumParts = 0;
|
||||
|
||||
// First, collect the names of all available attributes.
|
||||
FoundAttributes = 0;
|
||||
if (UseAttributes) {
|
||||
schematic (SCH)
|
||||
{
|
||||
SCH.allparts (P) // 2014-08-07
|
||||
{
|
||||
if (P.device.package)
|
||||
{
|
||||
if (P.populate)
|
||||
{
|
||||
P.attributes (A)
|
||||
{
|
||||
if (0 == FoundAttributes)
|
||||
{
|
||||
// First one
|
||||
AttributesList[0] = A.name;
|
||||
FoundAttributes = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
Found = 0;
|
||||
for (i = 0; i < FoundAttributes; i ++)
|
||||
{
|
||||
if (A.name == AttributesList[i])
|
||||
{
|
||||
// Found an already listed atrribute
|
||||
Found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (0 == Found)
|
||||
{
|
||||
// Attribute not listed, add at the end.
|
||||
AttributesList[FoundAttributes] = A.name;
|
||||
FoundAttributes ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
sort (FoundAttributes, AttributesList);
|
||||
}
|
||||
// Second, collect all data
|
||||
schematic (SCH)
|
||||
{
|
||||
SCH.allparts (P)
|
||||
{
|
||||
if (P.device.package)
|
||||
{
|
||||
if (P.populate)
|
||||
{
|
||||
PartName[NumParts] = P.name;
|
||||
PartValue[NumParts] = P.value;
|
||||
PartDevice[NumParts] = P.device.name;
|
||||
PartPackage[NumParts] = P.device.package.name;
|
||||
PartHeadline[NumParts] = P.device.headline;
|
||||
PartDescription [NumParts] = P.device.description;
|
||||
PartValueOn[NumParts] = P.device.value == "On";
|
||||
// Zero all strings
|
||||
for (i = 0; i < FoundAttributes; i ++)
|
||||
attr[i] = "";
|
||||
P.attributes(A)
|
||||
{
|
||||
for (i = 0; i < FoundAttributes; i ++)
|
||||
if (A.name == AttributesList[i])
|
||||
{
|
||||
attr[i] = A.value;
|
||||
break;
|
||||
}
|
||||
if ("VALUE" == A.name && 0 < strlen (A.value))
|
||||
// Override old fashioned value information!
|
||||
PartValueOn[NumParts] = 2;
|
||||
}
|
||||
PartAttributes[NumParts] = strjoin(attr, Separator);
|
||||
NumParts ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void GeneratePartList(void)
|
||||
{
|
||||
int NumLines = 0;
|
||||
string attr[], s;
|
||||
|
||||
if (UseAttributes) s = strjoin(AttributesList, '\t');
|
||||
Lines[NumLines ++] = tr ("Part\tValue\tDevice\tPackage\tDescription\t") + s;
|
||||
for (int i = 0; i < NumParts; i ++)
|
||||
{
|
||||
strsplit (attr, PartAttributes[i], Separator);
|
||||
if (UseAttributes) s = strjoin(attr, '\t');
|
||||
Lines[NumLines] = PartName[i] + "\t" + PartValue[i] + "\t" + PartDevice[i] + "\t" +
|
||||
PartPackage[i] + "\t" + PartHeadline[i] + "\t" + s;
|
||||
NumLines ++;
|
||||
}
|
||||
Lines[NumLines] = "";
|
||||
}
|
||||
|
||||
|
||||
// Generate list with one entry per value.
|
||||
// 'VALUE' is replaced by the value of attribute 'VAL', if existing.
|
||||
|
||||
void GenerateValueList (void)
|
||||
{
|
||||
int NumLines = 0;
|
||||
int Index [];
|
||||
string attr[], s, s_val;
|
||||
|
||||
if (UseAttributes) s = strjoin(AttributesList, '\t');
|
||||
|
||||
// 2010-04-17 cwi: Included description.
|
||||
Lines[NumLines ++] = tr ("Qty\tValue\tDevice\tPackage\tParts\tDescription\t") + s; // 2011-04-08
|
||||
sort (NumParts, Index, PartValue, PartDevice, PartPackage, PartAttributes, PartName, PartHeadline); // 2011-11-08 Partattribute jetzt nach Package alf@cadsoft.de
|
||||
for (int n1 = 0, n2 = 0; ++ n2 <= NumParts; )
|
||||
{
|
||||
int i1 = Index [n1];
|
||||
strsplit (attr, PartAttributes[i1], Separator);
|
||||
if (UseAttributes) s = strjoin(attr, '\t');
|
||||
s_val = attr[i1];
|
||||
if (n2 < NumParts)
|
||||
{
|
||||
int i2 = Index [n2]; // 2012-11-08
|
||||
strsplit (attr, PartAttributes[i2], Separator);
|
||||
if (PartValue[i1] == PartValue[i2] && PartDevice[i1] == PartDevice[i2] && PartAttributes[i1] == PartAttributes[i2]) // 2012-11-08 check diffent values of attributes
|
||||
continue;
|
||||
}
|
||||
string Quantity;
|
||||
sprintf (Quantity, "%d", n2 - n1);
|
||||
Lines[NumLines] = Quantity + "\t" + PartValue[i1] + "\t" + PartDevice[i1] + "\t" + PartPackage[i1] + "\t";
|
||||
for (;;)
|
||||
{
|
||||
Lines[NumLines] += PartName[i1];
|
||||
if (++n1 < n2)
|
||||
{
|
||||
i1 = Index [n1];
|
||||
Lines[NumLines] += ", ";
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
// cwi: add extra information from attributes
|
||||
// 2010-04-17 cwi: Included description.
|
||||
Lines[NumLines] += "\t" + PartHeadline[i1] + "\t" + s;
|
||||
NumLines ++;
|
||||
}
|
||||
Lines[NumLines] = "";
|
||||
}
|
||||
|
||||
|
||||
void GenerateList (void)
|
||||
{
|
||||
switch (ListType)
|
||||
{
|
||||
case ltParts: GeneratePartList (); break;
|
||||
case ltValues: GenerateValueList (); break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
string MakeListHeader (void)
|
||||
{
|
||||
string s;
|
||||
schematic(SCH)
|
||||
sprintf (s, tr ("Partlist exported from %s at %s"), SCH.name, t2string (time ()));
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
string MakeListText(void)
|
||||
{
|
||||
int l, Width [];
|
||||
string List;
|
||||
int numHeaders;
|
||||
|
||||
for (l = 0; Lines[l]; l ++)
|
||||
{
|
||||
string a [];
|
||||
for (int n = strsplit (a, Lines[l], '\t'); n --; )
|
||||
Width [n] = max (Width [n], strlen (a [n]));
|
||||
}
|
||||
|
||||
List = MakeListHeader () + "\n\n";
|
||||
|
||||
for (l = 0; Lines[l]; l ++)
|
||||
{
|
||||
string line, a [];
|
||||
|
||||
int n = strsplit (a, Lines[l], '\t');
|
||||
if (l == 0)
|
||||
numHeaders = n;
|
||||
else
|
||||
n = numHeaders; // for the hidden key!
|
||||
for (int i = 0; i < n; i ++)
|
||||
{
|
||||
string s;
|
||||
|
||||
sprintf (s, "%s%-*s", line ? " " : "", Width [i], a [i]);
|
||||
line += s;
|
||||
}
|
||||
List += line + "\n";
|
||||
}
|
||||
return List;
|
||||
}
|
||||
|
||||
|
||||
// 2008-11-24 Christian Schlittler:
|
||||
// Make comma-serparated list, with all values double-quoted.
|
||||
|
||||
string MakeListCSV (void)
|
||||
{
|
||||
string List;
|
||||
int numHeaders;
|
||||
|
||||
for (int l = 0; Lines[l]; l ++)
|
||||
{
|
||||
string a [];
|
||||
int n = strsplit (a, Lines[l], '\t');
|
||||
if (l == 0)
|
||||
numHeaders = n;
|
||||
else
|
||||
n = numHeaders; // for the hidden key!
|
||||
for (int i = 0; i < n; i ++)
|
||||
List += "\"" + a[i] + "\"" + SeparatorString;
|
||||
List += "\n";
|
||||
}
|
||||
return List;
|
||||
}
|
||||
|
||||
|
||||
string MakeListHTML (void)
|
||||
{
|
||||
string List;
|
||||
int numHeaders;
|
||||
|
||||
List = "<b>" + MakeListHeader() + "</b>\n<p>\n";
|
||||
List += "<table>\n";
|
||||
for (int l = 0; Lines[l]; l++)
|
||||
{
|
||||
List += "<tr>";
|
||||
string a [];
|
||||
int n = strsplit (a, Lines[l], '\t');
|
||||
if (l == 0)
|
||||
numHeaders = n;
|
||||
else
|
||||
n = numHeaders; // for the hidden key!
|
||||
for (int i = 0; i < n; i ++)
|
||||
{
|
||||
if (l == 0)
|
||||
a[i] = "<b>" + a[i] + "</b>";
|
||||
List += "<td>" + a[i] + "</td>";
|
||||
}
|
||||
List += "</tr>\n";
|
||||
}
|
||||
List += "</table>\n";
|
||||
return List;
|
||||
}
|
||||
|
||||
|
||||
string MakeList (void)
|
||||
{
|
||||
switch (OutputFormat)
|
||||
{
|
||||
case ofText: return MakeListText(); break;
|
||||
case ofCSV: return MakeListCSV(); break;
|
||||
case ofHTML: return MakeListHTML(); break;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
void ViewList (void)
|
||||
{
|
||||
dlgDialog (tr ("Bill Of Material - Preview"))
|
||||
{
|
||||
string s = MakeList ();
|
||||
if (OutputFormat == ofText || OutputFormat == ofCSV)
|
||||
s = "<pre>" + s + "</pre>";
|
||||
dlgHBoxLayout dlgSpacing (400);
|
||||
dlgHBoxLayout
|
||||
{
|
||||
dlgVBoxLayout dlgSpacing (300);
|
||||
dlgTextView (s);
|
||||
}
|
||||
dlgHBoxLayout
|
||||
{
|
||||
dlgStretch (1);
|
||||
dlgPushButton (tr ("-Close")) dlgReject ();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
void SaveList (void)
|
||||
{
|
||||
// 2008-11-24 cwi:
|
||||
// - Added new format extension .csv
|
||||
// - Changed from .bom to .txt for text format.
|
||||
string FileName;
|
||||
string FileExt;
|
||||
|
||||
switch (OutputFormat)
|
||||
{
|
||||
case ofText: FileExt = ".txt"; break;
|
||||
case ofHTML: FileExt = ".html"; break;
|
||||
case ofCSV: FileExt = ".csv"; break;
|
||||
}
|
||||
schematic(SCH) FileName = filesetext (SCH.name, FileExt);
|
||||
FileName = dlgFileSave (tr ("Save Bill Of Material"), FileName);
|
||||
if (FileName)
|
||||
{
|
||||
string a [];
|
||||
if (!fileglob (a, FileName) || dlgMessageBox (tr ("File '") + FileName +
|
||||
tr ("' exists\n\nOverwrite?"), tr("+&Yes"), tr("-&No")) == 0)
|
||||
{
|
||||
output (FileName, "wt")
|
||||
{
|
||||
printf ("%s", MakeList ()); // using "%s" to avoid problems if list contains any '%'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void DisplayHelp (void)
|
||||
{
|
||||
dlgDialog (tr ("Bill Of Material - Help"))
|
||||
{
|
||||
dlgHBoxLayout dlgSpacing (400);
|
||||
dlgHBoxLayout
|
||||
{
|
||||
dlgVBoxLayout dlgSpacing (300);
|
||||
dlgTextView (language () == "de" ? HelpTextDE : HelpTextEN);
|
||||
}
|
||||
dlgHBoxLayout
|
||||
{
|
||||
dlgStretch (1);
|
||||
dlgPushButton (tr ("-Close"))
|
||||
dlgReject ();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
schematic(SCH) {
|
||||
sprintf(SeparatorString, "%c", Separator);
|
||||
CurrentVariant = variant();
|
||||
SCH.variantdefs(VD) {
|
||||
if (CurrentVariant == VD.name) VDsel = cntVD;
|
||||
sprintf(Variants[cntVD], "%s", VD.name);
|
||||
cntVD++;
|
||||
}
|
||||
}
|
||||
|
||||
setvariant(CurrentVariant);
|
||||
CollectPartData(CurrentVariant);
|
||||
GenerateList();
|
||||
|
||||
dlgDialog (tr ("Bill Of Material"))
|
||||
{
|
||||
dlgHBoxLayout {
|
||||
dlgLabel(tr ("Current &variant "));
|
||||
dlgComboBox(Variants, VDsel) {
|
||||
CurrentVariant = Variants[VDsel];
|
||||
setvariant(CurrentVariant);
|
||||
CollectPartData(CurrentVariant);
|
||||
GenerateList();
|
||||
}
|
||||
dlgStretch(1);
|
||||
}
|
||||
dlgListView ("", Lines, Selected);
|
||||
dlgHBoxLayout
|
||||
{
|
||||
dlgGroup(tr ("List type"))
|
||||
{
|
||||
dlgRadioButton(tr ("&Parts"), ListType) GeneratePartList ();
|
||||
dlgRadioButton(tr ("&Values"), ListType) GenerateValueList ();
|
||||
dlgCheckBox(tr ("List &attributes"), UseAttributes) {
|
||||
if (!UseAttributes) {
|
||||
NumParts = 0;
|
||||
}
|
||||
CollectPartData(CurrentVariant);
|
||||
GenerateList();
|
||||
}
|
||||
}
|
||||
dlgGroup (tr ("Output format"))
|
||||
{
|
||||
// 2008-10-09: Entries swapped for correct function.
|
||||
dlgRadioButton(tr ("&Text"), OutputFormat);
|
||||
// 2008-11-24 cwi: New format added.
|
||||
dlgRadioButton(tr ("&CSV"), OutputFormat);
|
||||
dlgRadioButton(tr ("&HTML"), OutputFormat);
|
||||
}
|
||||
dlgStretch(1);
|
||||
}
|
||||
dlgHBoxLayout {
|
||||
dlgPushButton (tr ("+Vie&w")) ViewList ();
|
||||
dlgPushButton (tr ("&Save...")) SaveList ();
|
||||
dlgPushButton (tr ("H&elp")) DisplayHelp ();
|
||||
dlgPushButton (tr ("-Close")) dlgAccept ();
|
||||
dlgStretch(1);
|
||||
dlgLabel("Version " + Version);
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user