--- /dev/null
+<?php
+
+/*
+ * Copyright (C) 2013 Hugo Villeneuve <hugo@hugovil.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+/*
+ * Pour les composants identiques, PCAD les exporte chacun sur une ligne
+ * différente.
+ * Seul le premier du groupe a sa quantité spécifiée: les autres ont une
+ * quantité vide.
+ * Cette fonction combine donc toutes les lignes pour un même type de composant
+ * en une seule, et en combinant tous les refdes ensembles, séparés par des
+ * virgules.
+ */
+function refdes_combine(&$data, $num, $col_num_to_id, $col_id_to_num)
+{
+ global $debug;
+
+ $newpart = 0; /* Set to 1 when encountering a new part. */
+ $reflist = "";
+ $newpartkey = "";
+
+ foreach ($data as $key => $row) {
+
+ for ($c = 0; $c < $num; $c++) {
+ if ($col_num_to_id[$c] == DESIGNATOR_COL_NAME) {
+ $refdes = $row[$c];
+ }
+
+ if ($col_num_to_id[$c] == QTY_COL_NAME) {
+ if ($row[$c] == "") {
+ $newpart = 0;
+ } else {
+ $newpart = 1;
+
+ /* Save previous reflist if applicable. */
+ if ($reflist != "") {
+ if ($debug) {
+ echo " REFLIST = " . $reflist . "\n";
+ }
+
+ $data[$newpartkey][$col_id_to_num[DESIGNATOR_COL_NAME]] = $reflist;
+ }
+
+ $newpartkey = $key;
+ $reflist = "";
+ }
+ }
+ }
+
+ if ($newpart == 1) {
+ if ($debug) {
+ echo "DEBUG: NEWPART\n";
+ }
+
+ $reflist = $refdes;
+ } else {
+ $reflist = $reflist . "," . $refdes;
+
+ /* Discard row. */
+ unset($data[$key]);
+ }
+ }
+}
+
+?>
require_once 'Spreadsheet/Excel/Writer.php';
require_once 'Bomgen/functions.inc.php';
+require_once 'Bomgen/refdes.inc.php';
+
+$debug = 0;
define("DATA_ROW_START", 3);
define("PAPER_US_A4", 9);
define("PAPER_US_A5", 11);
+define("QTY_COL_NAME", "Count");
+define("COMPANY_PN_COL_NAME", "P/N_LSI");
+define("DESIGNATOR_COL_NAME", "RefDes");
+
/* width = 0 -> Ne pas afficher la colonne. */
$csv_infos =
array("Count" => array("nom" => "Qty",
"width" => 15),
"PatternName" => array("nom" => "Footprint",
"width" => 20),
- "Revision" => array("nom" => "Revision",
- "width" => 0),
- "DocumentNumber" => array("nom" => "DocumentNumber",
- "width" => 0),
- "NOPOP" => array("nom" => "NOPOP",
- "width" => 0),
"UnitCost" => array("nom" => "Unit Cost",
"width" => 7),
"TotalCost" => array("nom" => "Total Cost", /* Colonne ajoutée par ce script. */
"width" => 0),
);
-function usage()
-{
+function usage()
+{
echo "Usage: bomgen.php [OPTIONS] [INPUT FILE]\n";
echo "Generate an Excel BOM from an Altium CSV-exported BOM.\n";
echo "Output file has same name as input file, but with a .xls extension.\n";
}
}
} else {
- $ref_prefix2 = substr($row[$col_id_to_num['Designator']], 0, 2);
- $company_pn = substr($row[$col_id_to_num['Comment']], 0, 1); /* Pour les vieux BOMs qui n'ont pas
+ $ref_prefix2 = substr($row[$col_id_to_num[DESIGNATOR_COL_NAME]], 0, 2);
+ $company_pn = substr($row[$col_id_to_num[COMPANY_PN_COL_NAME]], 0, 1); /* Pour les vieux BOMs qui n'ont pas
* l'attribut NOPOP. */
-
if (($ref_prefix2 == "MH") ||
($ref_prefix2 == "TP") ||
+ ($ref_prefix2 == "FI") ||
(array_key_exists('NOPOP', $col_id_to_num) && ($row[$col_id_to_num['NOPOP']] == "NOPOP")) ||
($company_pn == "*")) {
/* Enlève les composants non désirés. */
fclose($handle);
}
+/* Combinaison de plusieurs lignes en une seule pour PCAD. */
+refdes_combine($data, $num, $col_num_to_id, $col_id_to_num);
+
/* Génère une liste des colonnes pour le tri. */
foreach ($data as $key => $row) {
$sort_type[$key] = $row[$col_id_to_num['Type']];
}
/*
- * Triage des lignes selon la référence (colonne "Designator"),
+ * Triage des lignes selon la référence (colonne DESIGNATOR_COL_NAME),
* et ensuite selon la description, la valeur et enfin le voltage.
*/
array_multisort($sort_type, SORT_ASC, SORT_STRING,
$comp_total++; /* Compte le nombre de composants total. */
$num = count($row);
- if (empty($project_name)) {
- $project_name = $row[$col_id_to_num['DocumentNumber']];
- }
- if (empty($revision)) {
- $revision = $row[$col_id_to_num['Revision']];
- }
-
/* Index de la prochaine colonne disponible pour affichage. */
$k = 0;
if (($add_cost == true) && ($col_num_to_id[$c] == "UnitCost")) {
/* Lecture du prix dans Syteline. */
- $price = get_price($row[$col_id_to_num['Comment']]);
+ $price = get_price($row[$col_id_to_num[COMPANY_PN_COL_NAME]]);
if ($price == 0) {
/* Si pas de prix Syteline, on utilise le prix dans Altium. */
$price = $row[$c];
if (empty($mpn)) {
/* Lecture du "MPN" dans Syteline si celui dans Altium est absent. */
- $mpn = get_mpn($row[$col_id_to_num['Comment']]);
+ $mpn = get_mpn($row[$col_id_to_num[COMPANY_PN_COL_NAME]]);
}
xls_write_cell($row_num, $k, $mpn, XLS_FORMAT_TEXT);
if (empty($manufacturer)) {
/* Lecture du "Manufacturer" dans Syteline si celui dans Altium est absent. */
- $manufacturer = get_manufacturer($row[$col_id_to_num['Comment']]);
+ $manufacturer = get_manufacturer($row[$col_id_to_num[COMPANY_PN_COL_NAME]]);
}
xls_write_cell($row_num, $k, $manufacturer, XLS_FORMAT_TEXT);
} else {
if ($width) {
$value = $row[$c];
-
+
/* Ligne de données. */
xls_write_cell($row_num, $k, $value, XLS_FORMAT_TEXT);
$k++;
$row_num . ")");
}
+/* TODO... */
+if (empty($project_name)) {
+ $project_name = "PROJECT NAME";
+}
+if (empty($revision)) {
+ $revision = "REV";
+}
+
/* Écriture des informations globales relatives au BOM. */
xls_write_cell_gen(0, 0, "BOM " . $project_name,
XLS_FORMAT_TEXT, false, 18, FALSE, FALSE);