L'Air du Bois est une plateforme Open Source de partage collaboratif ouverte à tous les amoureux du travail du bois. (En savoir plus)

Rejoindre l'Air du Bois Se connecter

exatex

Import pièce dans Processus depuis LDB plugin

Bonjour,

Apres avoir fait un plan sur Sketchup, j'aimerai utiliser le module processus du site. Je me demande si il existe u moyen d'importer les pièces depuis le module LDB de sketchup?

Cdlt,

yannick

Connectez-vous pour ajouter un commentaire.
?

2 réponses

1
Boris Beaulant
( Modifié )
Meilleure réponse

Bonjour Yannick,

Non, il n'existe pas de moyen d'automatiser ça pour l'instant. Les pièces doivent être saisies à la main une à une.

Mais c'est vrai que c'est une fonctionnalité qui serait intéressante. L'import pourrait être fait depuis un fichier CSV exporté du plugin. Une truc à ajouter à la todo list ;)

PS : Content de voir que tu veuilles utiliser les processus 😉

Mis à jour
exatex

je pense que c'est une bonne idée.
As tu un Backlog défini quelque part?

je n'ai pas beaucoup d'experience en php, mais regarderais si peux proposer un PR (pas avant avril-mai).

Boris Beaulant
( Modifié )

Non, pas de backlog. La solution du moment serait de mettre ça dans les issues. Après si tu as de la méthodo pour organiser mieux les idées, je suis preneur ;)

exatex
( Modifié )

Salut,
Je réponds un peu tard, mais j'ai cherché un outil de backlog & j'ai pris 15 jours de vacances au pays de Samuel :-)
Tu pourrais regarder chez zenhub.com
C'est en lien avec GitHub, et il semble que ce soit gratuit pour les Backlog lié a des repositories public. Je pense que le backlog deviens public également.

Boris Beaulant

Wep, désolé, j'ai pas testé sur le coup et ensuite, j'ai oublié.
Je ne suis pas bien connaisseur de ces outils. Peux-tu m'indiquer quels sont leurs avantages ?

exatex

Salut,
En ce moment mes réponses aurons quelques jours de délais.
En fait l'avantage de travailler avec un Board, c'est qu'il deviens plus facile de gérer les taches voulue sur le site web.
Par exemple (en version très simple), Une nouvelle demande de fonctionnalité est faite, elle va apparaître comme "New", tu peux la passer "Under Review" disons pour 2 semaines (valeur que tu défini comme tu le sent). Dans cette état, tout le monde peux discuter de cette fonctionnalité (ce qu'elle doit faire, comment, ...) après 2 semaine, tu (en temps que Project owner) défini les spécifications de la fonctionnalité, et tu la passe en "accepted", a partir de la un développeur peut décider d'écrire le code pour implémenter la fonction, puis la proposer en Pull Request, ou elle sera validé en fonction des spécifications qui on été défini. elle sera alors passé en "Done".
cette méthode te permet de garder le contrôle de l'application (Il faut toujours une personne qui s'assure de la ligne d'évolution d'une application, sinon ca deviens ingérable) sans devoir y passer des heures puisque tu n'interviens qu'au moment critiques du process: Definition/Validation des Spécification, Acceptation du code.
Et pour le développeur ca permet de savoir tout de suite ce qui doit être fait, et comment.

cdlt,

PS: je suis entrain de regarder comment automatiser le déploiement d'un site de test. Je t'en dirais plus une fois que j'aurai un proof of concept.

Connectez-vous pour ajouter un commentaire.
0
Flomac
( Modifié )

Bonjour,

Je me suis posé la même question et voyant qu'il n'y avait pas de solution, en voici une de contournement. J'espère que cela ne contrevient pas au règle d'utilisation du site de l'ADB.

J'ai écris un petit script qui fait croire au serveur de l'ADB qu'on lui soumet des pièce une à une.
Il y a une protection sur le serveur qui empêche de soumettre une foule de requêtes dans un temps trop court, ce qui est normale. J'ai donc du ajouter un temps d'attente entre 2 soumissions de pièces ce qui fait qu'il ne faut pas soumettre trop de pièces d'un seul coup au risque que le navigateur considère le script comme trop lent et cherche donc à l'arrêter ou freeze.

Le CSV (exporté depuis OpenCutList) que le script attend est de ce type :

N°;Désignation;Quantité
A;Socle;1
B;Traverse;2
etc...

Le principe du script : ajouter un bouton "input" afin de charger un fichier .csv et ensuite de soumettre automatiquement chaque ligne du CSV au serveur.
Pour utiliser ce script il faut ouvrir la console javascript du navigateur, le coller puis appuyer sur |entrer| pour l'exécuter. Ensuite il suffit de surveiller la console javascript pour voir l'avancement de l'importation.
[EDIT : cela ne fonctionne que si on quitte le processus après la création et qu'on l'édite ensuite ; je n'ai pas cherché à comprendre pourquoi]

En espérant que cela sera utile et utilisable à d'autres personnes que moi !

Voici la version compressée du script :

const processusId=document.location.href.split("/")[4].split("-")[0];let pieces;function handleFileSelect(e){for(var i,n=e.target.files,t=0;i=n[t];t++)if("text/csv"==i.type){var o=new FileReader;o.onload=function(e){pieces=csvToArray(o.result),$.post("/processus/"+processusId+"/part/new").done(function(e){formAddPiece=$(e),addPiece(formAddPiece.find("form"))})},o.readAsText(i);break}}function csvToArray(e,i=";"){const n=e.slice(0,e.indexOf("\n")).split(i),t=e.slice(e.indexOf("\n")+1).split("\n");return t.map(function(e){var t=e.split(i);return n.reduce(function(e,i,n){return e[i=i.normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace("°","").toLowerCase()]=t[n],e},{})})}$(".ladb-header-tools").prepend("<input type=\"file\" id=\"files\" name=\"files[]\" accept=\".csv\" multiple />"),document.getElementById("files").addEventListener("change",handleFileSelect,!1);let i=0;function resolveAfter3Seconds(i){return new Promise(e=>{setTimeout(()=>{e(i)},3e3)})}async function waitBeforeAddNewPiece(e){await resolveAfter3Seconds(10);addPiece(e)}function addPiece(n){var e=pieces[i];formAddPiece.find("#ladb_workflow_part_number").val(e.n),formAddPiece.find("#ladb_workflow_part_name").val(e.designation),formAddPiece.find("#ladb_workflow_part_count").val(e.quantite);var t=n.serialize(),e=n.attr("action");$.post(e,t).done(function(e){console.log(i+1+"/"+pieces.length),i++,i<pieces.length&&waitBeforeAddNewPiece(n)})}

Et la version détaillée pour ceux que cela intéresse :

const processusId = document.location.href.split('/')[4].split('-')[0];
let pieces;
$('.ladb-header-tools').prepend('<input type="file" id="files" name="files[]" accept=".csv" multiple />')
document.getElementById('files').addEventListener('change', handleFileSelect, false);
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object
// Loop through the FileList and render image files as thumbnails.
for (var i = 0, f; f = files[i]; i++) {
if (f.type != 'text/csv') {
continue;
}
var reader = new FileReader();
// Closure to capture the file information.
reader.onload = (function(theFile) {
return function(e) {
pieces = csvToArray(reader.result)
$.post( "/processus/"+processusId+"/part/new")
.done(function( data ) {
formAddPiece = $(data);
// for (let index = 0; index < pieces.length; index++) {
addPiece(formAddPiece.find('form'));
// }
});
};
})(f);
reader.readAsText(f)
break;
}
}

function csvToArray(str, delimiter = ";") {
// slice from start of text to the first \n index
// use split to create an array from string by delimiter
const headers = str.slice(0, str.indexOf("\n")).split(delimiter);

// slice from \n index + 1 to the end of the text
// use split to create an array of each csv value row
const rows = str.slice(str.indexOf("\n") + 1).split("\n");

// Map the rows
// split values from each row into an array
// use headers.reduce to create an object
// object properties derived from headers:values
// the object passed as an element of the array
const arr = rows.map(function (row) {
const values = row.split(delimiter);
const el = headers.reduce(function (object, header, index) {
header = header.normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace('°','').toLowerCase();
object[header] = values[index];
return object;
}, {});
return el;
});

// return the array
return arr;
}

let i = 0;
function resolveAfter3Seconds(x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x);
}, 3000);
});
};
async function waitBeforeAddNewPiece(form) {
var x = await resolveAfter3Seconds(10);
addPiece(form);
}
function addPiece(form) {
const element = pieces[i];
formAddPiece.find('#ladb_workflow_part_number').val(element.n);
formAddPiece.find('#ladb_workflow_part_name').val(element.designation);
formAddPiece.find('#ladb_workflow_part_count').val(element.quantite);
let formData = form.serialize()
let url = form.attr('action')
$.post( url, formData )
.done(function( data ) {
console.log((i+1)+'/'+pieces.length)
i++
if(i < pieces.length) {
waitBeforeAddNewPiece(form)
}
});
}

Mis à jour
Connectez-vous pour ajouter un commentaire.
252 vues
2 réponses

Publications associées

0 collection

Licence

Licence Creative Commons
Voir aussi
Navigation