SymSplitter
Coupe des fichiers LDraw suivant un plan de symétrie
(et plus encore !)
Mise à jour de la page : 20 mai 2015.
SymSplitter, écrit par Philo (Philippe Hurbain), est l'outil de choix pour exploiter
les symétries d'un fichier au format LDraw, et réduire sa taille. Vous pouvez
l'utiliser pour séparer les parties gauche/droite/milieu, couper les pièces par des plans,
et ajuster les coordonnées de sommets d'éléments proches d'un plan au plan lui-même.
C'est une simple application en ligne de commande. Le code source est fourni
ci-dessous, pour celui qui voudrait l'intégrer dans une interface plus
conviviale.
Il est possible de l'utiliser sous Windows, grâce à l'interface LETGUI
de Michael Heidemann, ce qui est hautement recommandé (voir plus bas).
Navigation rapide
Téléchargement
SymSplitter package (426 Ko), incluant le programme pour Windows,
la documentation, les fichiers source (Visual C++ 6.0), et des fichiers
exemples.
Historique
- V1.0 : Pré-version.
- V1.1 : 21-05-2010, première version publiée.
- V1.2 : 14-03-2014, Ajouté options de plan de coupe -X++ ... -Z--, d'inversion de coupe -i, de projection -d0.
Utilisation
- Sélectionnez le fichier LDraw d'entrée. Il peut contenir tous types d'entités LDraw.
Les primitives et sous-fichiers sont ignorés à moins de préciser à SymSplitter
de les décomposer.
- Si besoin, préparez le fichier coupant au format LDraw. Il définit les plans de coupe par
des triangles ou des quadrilatères.
De façon alternative les plans de coupe peuvent être définis par les
options de la ligne de commande (uniquement perpendiculaires aux axes principaux X/Y/Z).
- Ouvrez une fenêtre "Invite de commande".
- Tapez la ligne de commande du type :
SymSplitter [options] InFile [SplitterFile] OutFile
SymSplitter va créer le fichier OutFile, contenant
les éléments séparés et/ou coupés par les plans.
Notez que si le fichier existe, il est écrasé sans message d'erreur.
Aide au lancement
Si vous lancez le programme sans paramètre, vous obtenez un message d'aide
de l'usage du programme.
Description des options
Options de plan de coupe :
- -x+ : Coupe par le plan X=0, et garde les éléments X>0.
- -x++ <val> : Coupe par le plan X=val, et garde les éléments X>val.
- -x- : Coupe par le plan X=0, et garde les éléments X<0.
- -x-- <val> : Coupe par le plan X=val, et garde les éléments X<val.
- -y+ : Coupe par le plan Y=0, et garde les éléments Y>0.
- -y++ <val> : Coupe par le plan Y=val, et garde les éléments Y>val.
- -y- : Coupe par le plan Y=0, et garde les éléments Y<0.
- -y-- <val> : Coupe par le plan Y=val, et garde les éléments Y<val.
- -z+ : Coupe par le plan Z=0, et garde les éléments Z>0.
- -z++ <val> : Coupe par le plan Z=val, et garde les éléments Z>val.
- -z- : Coupe par le plan Z=0, et garde les éléments Z<0.
- -z-- <val> : Coupe par le plan Z=val, et garde les éléments Z<val.
Nota : Avec ces options, il n'y a pas besoin de fichier de coupe SplitterFile.
- -i : Inverse la direction de coupe.
Avec l'option -i, pas besoin d'inverser le sens des éléments dans le fichier
SplitterFile. Cette option est aussi active avec les plans de coupe généraux,
ainsi -i -x+ est identique à -x-.
Options à choix :
- -p <val> : Précision ou tolérance (0.001 par défaut).
- -da : Supprime les éléments traversant le plan de coupe.
- -di : Supprime les éléments complètement dans le plan de coupe.
- -dn : Supprime les éléments non touchés par le plan de coupe.
- -d0 : Pas d'éléments supprimés, seulement projection de sommets d'éléments sur le plan de coupe.
- -c : Colore les éléments traversant ou complètement dans le plan de coupe.
- -ca : Coupe les éléments traversant le plan de coupe.
- -v : Vérifie l'auto-symétrie des éléments traversant le plan de coupe.
- -s : Décompose les primitives et sous-fichiers.
- -l "path" : Définit le chemin de recherche du dossier LDraw,
pour décomposer primitives et sous-fichiers.
Fichiers :
- InFile : Fichier au format LDraw à découper. Exemple : symtest.dat.
- SplitterFile : Fichier contenant des entités LDraw définissant les plans de coupe. Exemple : plane.dat.
- OutFile : Fichier de sortie, ou résultat. Exemple : out.dat.
Voici une copie d'écran d'une simple exécution du programme :
Intégration dans LETGUI
Il est possible de lancer SymSplitter à partir d'une interface
plus conviviale que la ligne de commande. LETGUI créé par Michael Heidemann
est fait pour cela (depuis la version 1.5.0.0).
Utilisation de l'interface
- Sélectionnez "SymSplitter" dans le menu déroulant "Tool".
- Entrez le chemin d'accès à l'utilitaire SymSplitter, si cela n'a pas été configuré, dans le champ "SymSplitter".
- Entrez le nom du fichier d'entrée avec son chemin, dans le champ "Inputfile", ou le sélectionner
avec le bouton . Ce fichier
peut être visualisé en cliquant sur le bouton , ou
édité avec le bouton .
- Entrez le nom du fichier coupant, dans le champ "Splitterfile", ou sinon sélectionnez
l'une des case "split..." (voir plus bas). Nota : On peut inverser
les noms des fichiers précédents avec le bouton comportant la double flèche à leur droite.
- Entrez le nom du fichier de sortie, ou gardez celui défini automatiquement, dans le champ "Outputfile".
- Entrez dans le champ "precision" une nouvelle tolérance ou gardez la valeur par défaut.
- Cochez l'option de suppression -da, -di et -dn en cochant l'une des cases "delete elements..."
ou -d0 pour une projection simple en cochant "delete nothing...".
- Cochez l'option de coloration -c, en cochant la case "color elements...".
- Cochez l'option de vérification -v, en cochant la case "verify self-symmetry...".
- Cochez l'option de coupe des éléments -ca, en cochant la case "cut elements...".
- Cochez l'option de décomposition des primitives et sous-fichiers -s, en cochant la case
"expand subfiles", et en entrant un chemin de recherche des fichiers dans "searchpath -l".
- Sélectionnez le plan de coupe, et le coté des entités gardés en cochant l'une des cases "split ...".
- Cochez "Use Splitterfile", pour utiliser un fichier de coupe, ou sinon sélectionner
le plan de coupe au-dessus et si besoin son décalage par rapport au plan zéro.
- Cochez l'option d'inversion -i, en cochant la case "invert split direction" pour inverser le sens de coupe et les éléments à garder.
- Exécuter la commande en cliquant sur le bouton .
Pour plus d'informations générales sur cette interface, allez sur la page LETGUI.
Intégration dans LD Part Editor
SymSplitter a été intégré dans l'éditeur de pièce LD Part Editor, voir la page :
LD Part Editor, et particulièrement
le chapitre Séparation de maillage : SymSplitter.
Comment le programme travaille
- Les fichiers d'entrée et de coupe sont lus et analysés. Leurs contenus
sont stockés dans des tableaux. Si les plans de coupe sont définis
dans les options de la ligne de commande, un tableau de coupe est créé à partir de ces options.
- Si l'option de décomposition des sous-fichiers -s est utilisée,
le tableau principal est parcouru et tous les sous-fichiers et primitives trouvés
dans le chemin LDraw défini par l'option -l sont décomposés en leurs éléments
à la fin du tableau pour être coupés. Ces éléments décomposés gardent leur statut BFC sur le sens des faces.
- Pour chaque plan défini dans le fichier coupant (tout triangle ou quadrilatère) ou défini dans les options,
tous les éléments du fichier d'entrée sont testés et triés en 4 catégories :
- L'élément est complètement du côté de la face interne du plan (cette face est le côté "rouge"
d'une face certifiée BFC CCW). Cet élément est gardé.
- L'élément est complètement du côté de la face externe du plan (côté "vert"). Cet élément est supprimé.
Nota : avec l'option -i (nouveau en v1.2) les côtés interne et externe sont inversés.
- L'élément est complètement dans le plan de coupe.
- L'élément traverse le plan de coupe.
- Catégories des cas spéciaux :
- Seule la partie ligne des lignes conditionnelles détermine la catégorie.
Les points de contrôle peuvent être de n'importe quel côté du plan de coupe.
- Les primitives et sous-fichiers sont triés uniquement par rapport à leur origine.
Cela fonctionne souvent bien..., mais pas toujours ! Regardez au cas par cas.
- Les primitives de tenons (studs) qui ont un logo "LEGO" (stud.dat, stud2.dat, stug*.dat),
sont toujours considérés comme étant dans la partie centrale.
Cela évite de les inclure dans un sous-fichier latéral, qui est généralement ensuite symétrisé.
- Pendant ce processus de tri, tout sommet d'élément dont la distance au plan de coupe
est inférieure à la précision donnée par l'option -p,
est projeté sur le plan. Si de petits ajustements sont généralement utiles et inoffensifs,
de plus grands (grandes valeurs de -p),
peuvent occasionner des quadrilatères vrillés (gauchis), des formes déformées,
ou des lignes conditionnelles manquantes. Cette projection peut être
mise hors fonction en spécifiant une valeur 0 (option -p 0).
- Si -c est spécifié, les éléments sont colorés suivant leur catégorie :
- Les éléments surfaciques (sous-fichier, primitive, quadrilatère, et triangle)
entièrement dans le plan de coupe sont colorés en bleu (Blue).
- Les éléments filaires (ligne, et ligne conditionnelle)
entièrement dans le plan de coupe sont colorés en bleu clair (Light Blue).
- Les éléments surfaciques (sous-fichier, primitive, quadrilatère, et triangle)
traversant le plan de coupe sont colorés en jaune (Yellow).
- Les éléments filaires (ligne, et ligne conditionnelle)
traversant le plan de coupe sont colorés en rouge (Red).
- Les autres éléments sont supprimés en fonction des options de la ligne de commande :
- -di : Supprime tous les éléments se trouvant entièrement
dans le plan de coupe.
- -da : Supprime tous les éléments traversés par le plan de coupe.
- -dn : Supprime tous les éléments extérieurs au plan de coupe.
- -d0 : Supprime rien. Cette option est utile si vous voulez projeter
des sommets d'éléments sur le plan de coupe (nouveau en v1.2).
- Si -v est spécifié, les éléments traversant
le plan de coupe sont testés sur leur auto-symétrie par rapport à ce plan,
sauf pour les primitives et sous-fichiers. Les quadrilatères non auto-symétriques sont
colorés en rose (Pink), les lignes et lignes conditionnelles non auto-symétriques sont
colorées en vert clair (Bright Green).
Nota : l'option -v prévaut sur l'option -c.
- Si -ca ("cut across") est spécifié, les éléments sont coupés par le plan de coupe,
et les parties du mauvais côté sont supprimés.
- Le fichier de sortie est écrit.
Exemples d'utilisation
Séparation droite/gauche/centre
C'est le but le plus simple de SymSplitter : Séparer une pièce symétrique en sa partie
centrale, qui sera inclue dans le fichier principal de la pièce, et une des parties latérales qui sera
mise dans un sous-fichier et symétrisée pour obtenir la pièce complète. L'exemple provient
de la pièce 47406, et son fichier est originaire du "LEGO Universe Team".
Après beaucoup de substitutions de primitives et d'ajustement de quadrilatères et triangles
pour les relier, j'avais le fichier suivant (à gauche) avec la partie centrale, et un coté complet.
En utilisant simplement SymSplitter pour colorer les entités (à droite), on visualise
la partie centrale, et ce qui deviendra le sous-fichier latéral.
Nous le séparerons par le plan Z=0, en supprimant les entités aux données Z<0.
Puisque la séparation se fait sur un des plans cartésiens principaux, il n'y a pas besoin
de fournir un fichier de coupe (SplitterFile), et nous utiliserons l'option -z-
(signifie couper par le plan Z=0, en gardant les entités en Z<0.
Les options -x- et -y+ sont similaires
pour les plans X=0, et Y=0, en gardant les entités X<0 ou Y>0.
Ligne de commande :
SymSplitter -z- -c 47406-ssp.dat 47406-col.dat
Nous pouvons maintenant faire la séparation elle-même en deux temps. Utiliser l'option -dn
supprime tout ce qui n'est pas dans la partie centrale, alors que les options -di -da
gardent uniquement une des parties latérales, suivant le plan de coupe et son sens.
Notez que bien qu'ils ne soient pas centrés, les tenons
sont mis dans la partie centrale, pour éviter de les symétriser par la suite.
Lignes de commande :
SymSplitter -z- -dn 47406-ssp.dat 47406-mid.dat
SymSplitter -z- -di -da 47406-ssp.dat 47406-side.dat
Vérification de l'Auto-symétrie
Nous vérifions maintenant si des entités de la partie centrale sont auto-symétriques,
en utilisant l'option -v, il apparait qu'une petite zone ne l'est pas,
en la mettant en rose (Pink), et vert clair (Bright Green).
Après une analyse fine, il apparait que cela est causé par des erreurs d'arrondis mineurs.
En augmentant la valeur de la précision de 0.001 (par défaut) à 0.01, avec l'option
-p 0.01, on supprime ce problème.
Notez que l'option -v a ses limitations :
Les primitives ou sous-fichiers ne sont pas vérifiés. Vous pouvez essayer
de les décomposer pour la vérification en utilisant l'option -s.
Mais, il est possible que les quadrilatères et triangles forment ensemble
une forme auto-symétrique alors que chaque composant pris individuellement ne le soit pas.
Lignes de commande :
SymSplitter -z- -v 47406-mid.dat 47406-ver.dat
SymSplitter -z- -v -p 0.01 47406-mid.dat 47406-vok.dat
Ajustement de coupe avec la fonction de projection
L'usage de coupe par projection de SymSplitter est le premier que j'ai testé
(Dixit Philo) "en vrai grandeur".
Le fichier du pneu 32003 (Tyre 68.8 x 24S) était en attente dans "LDraw Parts Tracker" depuis longtemps.
Le sous-fichier de cette pièce a été créé "un poil" trop grand, et chaque segment de ce pneu chevauche
le précédent (voir ci-dessus à gauche), empêchant l'usage approprié des lignes conditionnelles
entre les sous-fichiers.
Un fichier de coupe a été créé avec 2 triangles définissant un angle de 10° (le pneu a 36
segments). Nota : Ces triangles sont créés avec l'orientation de leurs faces internes "rouges" vers l'intérieur
de la forme en "V" (voir ci-dessus au centre). Il a été appliqué au sous-fichier 32003a, avec des valeurs de précision
croissantes. Pour p=0.1 les éléments du sous-fichier sont proprement projetés sur les plans de coupe.
Le résultat est correct, sans avoir réellement coupé quoi que ce soit (voir ci-dessus à droite).
Avertissement important : La fonction de projection peut produire
des quadrilatères non plans, ou même des trous, si la pièce initiale
contient des jonctions en "T". Vérifiez avec soin !
Ligne de commande :
SymSplitter -p 0.1 32003a.dat 32003sep.dat 32003aok.dat
Ajustement plan d'un maillage
Les maillages créés avec un scanner 3D, comme celui de Philo :
Scanner 3D, ou avec le
DAVID laserscanner,
ont souvent besoin d'être coupés par la moitié, ou modifiés pour avoir
une vraie base plane. Le programme Intersector
peut faire ce travail, mais des triangles souvent minuscules restent à cause
de sommets très proches du plan de coupe, sans être dessus.
Utiliser la fonction de projection sur le plan de SymSplitter avec
un seuil de précision plutôt haut peut aider. Parfois, vous n'avez même pas besoin
de couper quoi que ce soit !
L'exemple ci-dessus montre comment former une base plane sous le maillage
de la grenouille saisie avec mon (Dixit Philo) Scanner 3D.
La précision est augmentée petit à petit, et de plus en plus de sommets
sont projetés sur le plan Y=0. Les éléments jaunes coupent le plan de base.
Pour p=0.3 vous obtenez une base plane, sans rien qui traverse le plan.
Naturellement la précision "p" doit rester assez basse, pour prévenir de déformations trop importantes.
Lignes de commande :
SymSplitter -c -y- -p 0.25 frog.dat frogp0.25.dat
SymSplitter -c -y- -p 0.3 frog.dat frogp0.3.dat
Coupe de maillage avec suppression des petits triangles
Pour couper le fichier de la grenouille, vous aurez besoin de couper des éléments
pour obtenir un résultat propre. Spécifier une valeur de précision plus grande
vous débarrasse de triangles minuscules et réduit le nombre d'éléments
coupés.
L'exemple ci-dessus montre la zone proche de la tête de la grenouille,
et la simplification lorsque "p" passe de 0 à 0.3.
Lignes de commande :
SymSplitter -ca -x+ -p 0 frog.dat frogxp0.dat
SymSplitter -ca -x+ -p 0.3 frog.dat frogxp0.3.dat
Droits et Copyright
Le programme SymSplitter et son manuel d'utilisation appartient à (c) Philo (Philippe Hurbain).
Vous pouvez le retrouver sur son site et sa
page des utilitaires LDraw,
et sur la version d'origine en
anglais de cette page.
Traduction et Adaptation : J.C. Tchang.