diff --git a/utils/converters/autocad/dxf2geo.pl b/utils/converters/autocad/dxf2geo.pl new file mode 100644 index 0000000000000000000000000000000000000000..7443f0a88421054b2a3d4ac926277b1c663a50fb --- /dev/null +++ b/utils/converters/autocad/dxf2geo.pl @@ -0,0 +1,791 @@ +#!/usr/bin/perl +# dxf2geo.pl SOURCE LC 01/11/09 +# +# [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] +# CHAMPANEY Laurent Universite de Versailles St Quentin le 24 / 10 / 01 +# +# Transfert de geometrie DXF (AutoCAD) vers GEO (GMSH) +# +# Usage : +# dxf2geo.pl [-d densite] [-e epsilon] [-v] +# [-D dimension] [-s GIBI;GMSH] essai +# +# lit essai.dxf et le converti en essai.geo (-s GMSH) +# essai.dgibi (-s GIBI) +# +# +# ====================================================================== +# +# ====================================================================== +# Analyse des arguments +# ====================================================================== +use Getopt::Long; +@knownoptions = ("dimension|n=i", + "densite|d=f", + "epsilon|e=f", + "sortie|s=s", + "help|h", + "verbose|v"); +GetOptions (@knownoptions) || exit ; +$dimen1 = 2; +if ($opt_dimension){$dimen1=$opt_dimension}; +$densi1 = 1.; +if ($opt_densite){$densi1=$opt_densite}; +$sortie = "GMSH"; +if ($opt_sortie){$sortie=$opt_sortie}; +$epsi1 = 1E-5; +if ($opt_epsilon){$epsi1=$opt_epsilon}; +$verb1 = 0; +if ($opt_verbose){$verb1=1}; +# +if ($opt_help){sortie_usage(); exit();}; +# +if($#ARGV==-1) { sortie_usage(); exit();} +else { + ($generic , $generic_ext) = ( $ARGV[0] =~ /([-_\/\w]*)\.?(\w*)/ ) ; +} +# +# ====================================================================== +# Valeurs par defaut +# ====================================================================== +$pi = atan2(1.,1.) * 4.; +# ====================================================================== +# Fichiers +# ====================================================================== +$dxf_file ="$generic.dxf"; +if ($sortie eq "GIBI"){ + $sor_file = "$generic.dgibi"; +} +else { + $sor_file = "$generic.geo"; +} +# +# ====================================================================== +# En premier on mange le fichier dxf : les ENTITES seulement +# ====================================================================== +open (INFIC, $dxf_file) || die "Le fichier $dxf_file n existe pas\n"; +#$line = <INFIC>; +$nb1 = 0; +$flag1 = 0; +# +while ($line = <INFIC>) +{ + chomp($line); +# Pour traiter les fichiers dos + $line=~ s/\r//; + if ($line eq 'ENTITIES') {$flag1 = 1}; + if ($line eq 'ENDSEC') {$flag1 = 0}; + if ($flag1 == 1) + { + $nb1 ++; + $inlines[$nb1] = $line; +# print "$inlines[$nb1]\n"; + } +} +close (INFIC); +# +# ====================================================================== +# On commence a lire +# ====================================================================== +# Initialisations +$nb_POINT = 0; +$nb_LINE = 0; +$nb_ARC = 0; +$nb_CIRCLE = 0; +$nb_ELLI = 0; +$nb_LLINE = 0; +# +for ($iline = 1 ; $iline <= $nb1 ; $iline++) +{ + $line = $inlines[$iline]; + if ($line eq 'LINE'){lit_LINE()} + if ($line eq 'CIRCLE'){lit_CIRCLE()} + if ($line eq 'ARC'){lit_ARC()} + if ($line eq 'LWPOLYLINE'){lit_LWPOLYLINE()} + if ($line eq 'ELLIPSE'){lit_ELLIPSE()} +} +# +# ====================================================================== +# On ecrit le fichier +# ====================================================================== +open (OUFIC, ">$sor_file"); +# +if ($sortie eq "GIBI"){ + sortie_gibi(); +} +else { + sortie_gmsh(); +} +# +close OUFIC; +# +# ====================================================================== +# On sort +# ====================================================================== +print "\n"; +print "Conversion $dxf_file vers $sor_file effectuee\n"; +print " (Densit� $densi1 - Espilon pour les jonctions : $epsi1)\n"; +print "\n"; +exit; +# +# +# ===========================================================> End <=== +# +# ====================================================================== +# Subroutines +# ====================================================================== +# +# +# +# ====================================================================== +# Avancee dans le fichier +# ====================================================================== +# +sub avance { + while ($inlines[$iline] ne "@_") {$iline ++} +}; +# +# ====================================================================== +# Controle du type de calque +# ====================================================================== +# +sub controle_calque { + avance(" 8"); + $iline ++; + $si_etoile = ($inlines[$iline] =~ /^\*/); + return $si_etoile; +}; +# +# +# ====================================================================== +# Lecture des entites LINE +# ====================================================================== +# +sub lit_LINE { +# +# Controle Calque + if (controle_calque()) {return}; +# +# Premier point + avance(" 10"); + $iline ++; + my $x1 = $inlines[$iline]; + avance(" 20"); + $iline ++; + my $y1 = $inlines[$iline]; + my $p1 = new_point($x1, $y1); +# Deuxieme point + avance(" 11"); + $iline ++; + my $x2 = $inlines[$iline]; + avance(" 21"); + $iline ++; + my $y2 = $inlines[$iline]; + my $p2 = new_point($x2, $y2); +# + $nb_LINE++; + $LINE[$nb_LINE][1] = $p1; + $LINE[$nb_LINE][2] = $p2; + if ($verb1){print "LINE : Ligne $nb_LINE : $p1 $p2\n";} +# + return; +}; +# +# +# ====================================================================== +# Lecture des entites CIRCLE +# ====================================================================== +# +sub lit_CIRCLE { +# +# Controle Calque + if (controle_calque()) {return}; +# +# Centre + avance(" 10"); + $iline ++; + my $x1 = $inlines[$iline]; + avance(" 20"); + $iline ++; + my $y1 = $inlines[$iline]; + my $c0 = new_point($x1, $y1); +# Rayon + avance(" 40"); + $iline ++; + my $r0 = $inlines[$iline]; +# Construction des points intermediaires + $x2 = $x1 + $r0; + $y2 = $y1 ; + my $p1 = new_point($x2, $y2); + $x2 = $x1 ; + $y2 = $y1 + $r0; + my $p2 = new_point($x2, $y2); + $x2 = $x1 - $r0; + $y2 = $y1 ; + my $p3 = new_point($x2, $y2); + $x2 = $x1 ; + $y2 = $y1 - $r0; + my $p4 = new_point($x2, $y2); +# +# Construction des lignes + $nb_CIRCLE++; + $CIRCLE[$nb_CIRCLE][1] = $p1; + $CIRCLE[$nb_CIRCLE][2] = $c0; + $CIRCLE[$nb_CIRCLE][3] = $p2; + if ($verb1){print "CIRCLE : Arc $nb_CIRCLE : $p1 $c0 $p2\n";} + $nb_CIRCLE++; + $CIRCLE[$nb_CIRCLE][1] = $p2; + $CIRCLE[$nb_CIRCLE][2] = $c0; + $CIRCLE[$nb_CIRCLE][3] = $p3; + if ($verb1){print "CIRCLE : Arc $nb_CIRCLE : $p2 $c0 $p3\n";} + $nb_CIRCLE++; + $CIRCLE[$nb_CIRCLE][1] = $p3; + $CIRCLE[$nb_CIRCLE][2] = $c0; + $CIRCLE[$nb_CIRCLE][3] = $p4; + if ($verb1){print "CIRCLE : Arc $nb_CIRCLE : $p3 $c0 $p4\n";} + $nb_CIRCLE++; + $CIRCLE[$nb_CIRCLE][1] = $p4; + $CIRCLE[$nb_CIRCLE][2] = $c0; + $CIRCLE[$nb_CIRCLE][3] = $p1; + if ($verb1){print "CIRCLE : Arc $nb_CIRCLE : $p4 $c0 $p1\n";} +# Le cercle complet + $nb_LLINE++; + $LLINE[$nb_LLINE][0] = 4; + $LLINE[$nb_LLINE][1] = -1 * ($nb_CIRCLE - 3); + $LLINE[$nb_LLINE][2] = -1 * ($nb_CIRCLE - 2); + $LLINE[$nb_LLINE][3] = -1 * ($nb_CIRCLE - 1); + $LLINE[$nb_LLINE][4] = -1 * ($nb_CIRCLE) ; +# + return; +}; +# +# +# ====================================================================== +# lecture des entites ARC +# ====================================================================== +# +sub lit_ARC { +# +# Controle Calque + if (controle_calque()) {return}; +# +# Centre + avance(" 10"); + $iline ++; + my $x1 = $inlines[$iline]; + avance(" 20"); + $iline ++; + my $y1 = $inlines[$iline]; + my $c0 = new_point($x1, $y1); +# Rayon + avance(" 40"); + $iline ++; + my $r0 = $inlines[$iline]; +# Angles initial et final + avance(" 50"); + $iline ++; + my $a1 = $inlines[$iline]; + avance(" 51"); + $iline ++; + my $a2 = $inlines[$iline]; +# Construction du point initial + $x2 = $x1 + ($r0 * cos($a1 / 180. * $pi)); + $y2 = $y1 + ($r0 * sin($a1 / 180. * $pi)); + my $p1 = new_point($x2, $y2); + $a0 = ($a2 - $a1); + if ($a0 < 0.) {$a0 = $a0 + 360.}; + if ($a0 >= 180.) + { +# Construction du point intermediaire + $a3 = ($a2 + $a1) / 2.; + if (($a2 - $a1) < 0.) {$a3 = $a3 + 180.}; + $x2 = $x1 + ($r0 * cos($a3 / 180. * $pi)); + $y2 = $y1 + ($r0 * sin($a3 / 180. * $pi)); + my $p2 = new_point($x2, $y2); +# Construction du point final + $x3 = $x1 + ($r0 * cos($a2 / 180. * $pi)); + $y3 = $y1 + ($r0 * sin($a2 / 180. * $pi)); + my $p3 = new_point($x3, $y3); +# Construction des lignes + $nb_CIRCLE++; + $CIRCLE[$nb_CIRCLE][1] = $p1; + $CIRCLE[$nb_CIRCLE][2] = $c0; + $CIRCLE[$nb_CIRCLE][3] = $p2; + if ($verb1){print "ARC : Arc $nb_CIRCLE : $p1 $c0 $p2\n";} +# Construction des lignes + $nb_CIRCLE++; + $CIRCLE[$nb_CIRCLE][1] = $p2; + $CIRCLE[$nb_CIRCLE][2] = $c0; + $CIRCLE[$nb_CIRCLE][3] = $p3; + if ($verb1){print "ARC : Arc $nb_CIRCLE : $p2 $c0 $p3\n";} +# Le cercle complet + $nb_LLINE++; + $LLINE[$nb_LLINE][0] = 2; + $LLINE[$nb_LLINE][1] = -1*($nb_CIRCLE - 1); + $LLINE[$nb_LLINE][2] = -1*($nb_CIRCLE) ; + } + else + { +# Construction du point final + $x2 = $x1 + ($r0 * cos($a2 / 180. * $pi)); + $y2 = $y1 + ($r0 * sin($a2 / 180. * $pi)); + my $p2 = new_point($x2, $y2); +# Construction des lignes + $nb_CIRCLE++; + $CIRCLE[$nb_CIRCLE][1] = $p1; + $CIRCLE[$nb_CIRCLE][2] = $c0; + $CIRCLE[$nb_CIRCLE][3] = $p2; + if ($verb1){print "ARC : Arc $nb_CIRCLE : $p1 $c0 $p2\n";} + } +# + return; +}; +# +# +# ====================================================================== +# Lecture des entites LWPOLYLINE +# ====================================================================== +# +sub lit_LWPOLYLINE { +# +# Controle Calque + if (controle_calque()) {return}; +# +# nombre de segments + avance(" 90"); + $iline ++; + $nb_sommets = int($inlines[$iline]); + avance(" 70"); + $iline ++; + $poly_fermee = int($inlines[$iline]); +# print "Polyline : $nb_sommets sommets : ferme : $poly_fermee \n"; + for (my $i = 1 ; $i <= $nb_sommets ; $i++) { + avance(" 10"); + $iline ++; + $poly[$i][1] = $inlines[$iline]; + avance(" 20"); + $iline ++; + $poly[$i][2] = $inlines[$iline]; + if ($inlines[$iline + 1] eq " 42") { + avance(" 42"); + $iline ++; + $poly[$i][3] = $inlines[$iline]; + } + else { + $poly[$i][3] = 0; + } +# print "$poly[$i][1] $poly[$i][2] $poly[$i][3] \n"; + } +# La multi-ligne pour la sortie GIBI + $nb_LLINE++; + my $nb_LLINE1 = 0; +# +# Premier point + $x1 = $poly[1][1]; + $y1 = $poly[1][2]; + $p1 = new_point($x1, $y1); +# + for (my $i = 2 ; $i <= ($nb_sommets + $poly_fermee); $i++) { +# +# Deuxieme point + if ($i < ($nb_sommets + 1)) { + $x2 = $poly[$i][1]; + $y2 = $poly[$i][2]; + $p2 = new_point($x2, $y2); + } + else { + $x2 = $poly[1][1]; + $y2 = $poly[1][2]; + $p2 = new_point($x2, $y2); + } +# + if ($poly[$i-1][3] == 0) { + $nb_LINE++; + $LINE[$nb_LINE][1] = $p1; + $LINE[$nb_LINE][2] = $p2; + if ($verb1){print "POLY : Ligne $nb_LINE : $p1 $p2\n";} + $nb_LLINE1 ++; + $LLINE[$nb_LLINE][$nb_LLINE1] = $nb_LINE; + } + else { + # Rayon + my $L = sqrt((($x2 - $x1)*($x2 - $x1)) + (($y2 - $y1)*($y2 - $y1))); + my $a = $poly[$i-1][3] ; + my $R = ($L/2.)*(1. + ($a*$a))/(2.*$a); + my $X = $R - ($a * $L / 2.); + if (abs($a) > 1.){$R = -1.*$R}; + my $nx = ($x2 - $x1) / $L; + my $ny = ($y2 - $y1) / $L; + my $mx = -1.*$ny; + my $my = $nx; + my $x0 = $x1 + ($L/2.*$nx) + ($mx * $X); + my $y0 = $y1 + ($L/2.*$ny) + ($my * $X); + my $c0 = new_point($x0, $y0); +# Construction des lignes + if (abs($a) < 0.999) { + $nb_CIRCLE++; + $CIRCLE[$nb_CIRCLE][1] = $p1; + $CIRCLE[$nb_CIRCLE][2] = $c0; + $CIRCLE[$nb_CIRCLE][3] = $p2; + if ($verb1){print "POLY : Arc $nb_CIRCLE : $p1 $c0 $p2\n";} + $nb_LLINE1 ++; + $LLINE[$nb_LLINE][$nb_LLINE1] = -1*($nb_CIRCLE); + } + else { + my $x3 = $x1 + ($L/2.*$nx) - ($mx*$a*$L/2.); + my $y3 = $y1 + ($L/2.*$ny) - ($my*$a*$L/2.); + my $p3 = new_point($x3, $y3); +# + $nb_CIRCLE++; + $CIRCLE[$nb_CIRCLE][1] = $p1; + $CIRCLE[$nb_CIRCLE][2] = $c0; + $CIRCLE[$nb_CIRCLE][3] = $p3; + if ($verb1){print "POLY : Arc $nb_CIRCLE : $p1 $c0 $p3\n";} + $nb_LLINE1 ++; + $LLINE[$nb_LLINE][$nb_LLINE1] = -1*($nb_CIRCLE); +# + $nb_CIRCLE++; + $CIRCLE[$nb_CIRCLE][1] = $p3; + $CIRCLE[$nb_CIRCLE][2] = $c0; + $CIRCLE[$nb_CIRCLE][3] = $p2; + if ($verb1){print "POLY : Arc $nb_CIRCLE : $p3 $c0 $p2\n";} + $nb_LLINE1 ++; + $LLINE[$nb_LLINE][$nb_LLINE1] = -1*($nb_CIRCLE); + } + + } +# + $x1 = $x2; + $y1 = $y2; + $p1 = $p2; + } +# + $LLINE[$nb_LLINE][0] = $nb_LLINE1; +# + return; +}; +# +# +# ====================================================================== +# Lecture des entites ELLIPSE +# ====================================================================== +# +sub lit_ELLIPSE { +# +# Controle Calque + if (controle_calque()) {return}; +# +# Premier point + avance(" 10"); + $iline ++; + my $x1 = $inlines[$iline]; + avance(" 20"); + $iline ++; + my $y1 = $inlines[$iline]; + my $p1 = new_point($x1, $y1); +# Deuxieme point + avance(" 11"); + $iline ++; + my $x2 = $inlines[$iline]; + $x2 = $x1 + $x2; + avance(" 21"); + $iline ++; + my $y2 = $inlines[$iline]; + $y2 = $y1 + $y2; + my $p2 = new_point($x2, $y2); + avance(" 40"); + $iline ++; + my $r0 = $inlines[$iline]; + avance(" 41"); + $iline ++; + my $a1 = $inlines[$iline]; + $u1 = $a1 * 180. / $pi; + avance(" 42"); + $iline ++; + my $a2 = $inlines[$iline]; + $u2 = $a2 * 180. / $pi; +# +# Construction du premier point + $r1 = sqrt((($x2 - $x1) ** 2) + (($y2 - $y1) ** 2)); + $r2 = $r0 * $r1; + $thet1 = atan2(($y2 - $y1),($x2 - $x1)); + $xp0 = ($r1 * cos ($a1)); + $yp0 = ($r2 * sin ($a1)); + $xp1 = $x1 + ( $xp0 * cos($thet1)) - ( $yp0 * sin($thet1)); + $yp1 = $y1 + ( $xp0 * sin($thet1)) + ( $yp0 * cos($thet1)); + $p3 = new_point($xp1, $yp1); +# + $a0 = ($u2 - $u1); + if ($a0 < 0.) {$a0 = $a0 + 360.}; + if ($a0 >= 180.) + { +# Construction du point intermediaire + $a3 = ($u2 + $u1) / 2.; + if (($u2 - $u1) < 0.) {$a3 = $a3 + 180.}; + $xp0 = ($r1 * cos ($a3 / 180 * $pi)); + $yp0 = ($r2 * sin ($a3 / 180 * $pi)); + $xp1 = $x1 + ( $xp0 * cos($thet1)) - ( $yp0 * sin($thet1)); + $yp1 = $y1 + ( $xp0 * sin($thet1)) + ( $yp0 * cos($thet1)); + my $p4 = new_point($xp1, $yp1); +# Construction du point final + $xp0 = ($r1 * cos ($a2)); + $yp0 = ($r2 * sin ($a2)); + $xp1 = $x1 + ( $xp0 * cos($thet1)) - ( $yp0 * sin($thet1)); + $yp1 = $y1 + ( $xp0 * sin($thet1)) + ( $yp0 * cos($thet1)); + my $p5 = new_point($xp1, $yp1); +# Construction des lignes + $nb_ELLI++; + $ELLI[$nb_ELLI][1] = $p1; + $ELLI[$nb_ELLI][2] = $p2; + $ELLI[$nb_ELLI][3] = $r0; + $ELLI[$nb_ELLI][4] = $u1; + $ELLI[$nb_ELLI][5] = $a3; + $ELLI[$nb_ELLI][6] = $p3; + $ELLI[$nb_ELLI][7] = $p4; + if ($verb1){print "ELLIPS: Ligne $nb_ELLI : $p1 $p2 $r0 $u1 $u2\n";} +# Construction des lignes + $nb_ELLI++; + $ELLI[$nb_ELLI][1] = $p1; + $ELLI[$nb_ELLI][2] = $p2; + $ELLI[$nb_ELLI][3] = $r0; + $ELLI[$nb_ELLI][4] = $a3; + $ELLI[$nb_ELLI][5] = $u2; + $ELLI[$nb_ELLI][6] = $p4; + $ELLI[$nb_ELLI][7] = $p5; + if ($verb1){print "ELLIPS: Ligne $nb_ELLI : $p1 $p2 $r0 $u1 $u2\n";} +# Le cercle complet + $nb_LLINE++; + $LLINE[$nb_LLINE][0] = 2; + $LLINE[$nb_LLINE][1] = -1*($nb_ELLI - 1); + $LLINE[$nb_LLINE][2] = -1*($nb_ELLI) ; + } + else + { +# Construction du point final + $xp0 = ($r1 * cos ($a2)); + $yp0 = ($r2 * sin ($a2)); + $xp1 = $x1 + ( $xp0 * cos($thet1)) - ( $yp0 * sin($thet1)); + $yp1 = $y1 + ( $xp0 * sin($thet1)) + ( $yp0 * cos($thet1)); + my $p4 = new_point($x3, $y3); +# Construction des lignes + $nb_ELLI++; + $ELLI[$nb_ELLI][1] = $p1; + $ELLI[$nb_ELLI][2] = $p2; + $ELLI[$nb_ELLI][3] = $r0; + $ELLI[$nb_ELLI][4] = $u1; + $ELLI[$nb_ELLI][5] = $u2; + $ELLI[$nb_ELLI][6] = $p3; + $ELLI[$nb_ELLI][7] = $p4; + if ($verb1){print "ELLIPS: Ligne $nb_ELLI : $p1 $p2 $r0 $u1 $u2\n";} + } +# + return; +}; +# +# ====================================================================== +# CREATION d'un nouveau POINT +# ====================================================================== +# +# +sub new_point { + my($x0, $y0) = @_; +# print "Test de point $x0 $y0\n"; + if ($nb_POINT != 0) + { + $i_POINT = 0; + for (my $i = 1 ; $i <= $nb_POINT ; $i++) + { + $dist = sqrt((($POINT[$i][1] - $x0) ** 2) + + (($POINT[$i][2] - $y0) ** 2)); +# printf ("%+22.14E\n",$dist); +# if (($POINT[$i][1] == $x0) && ($POINT[$i][2] == $y0)) + if ($dist < $epsi1) + { + $i_POINT = $i; + } + } + if ($i_POINT == 0) + { + cree_point($x0,$y0); + $i_POINT = $nb_POINT; + } + } + else + { + cree_point($x0,$y0); + $i_POINT = $nb_POINT; + } + return $i_POINT; +}; + +sub cree_point { + my($x0, $y0) = @_; + $nb_POINT ++; + $POINT[$nb_POINT][1] = $x0; + $POINT[$nb_POINT][2] = $y0; + if ($verb1){print "Nouveau POINT : $nb_POINT : $x0 $y0\n";} +}; +# +# ====================================================================== +# SORTIE vers GMSH +# ====================================================================== +# +sub sortie_gmsh { +# La densite + printf OUFIC "d1 = $densi1;\n"; +# Les points + for ($i = 1 ; $i <= $nb_POINT ; $i++) { + printf OUFIC ("Point($i) = {%+22.14E, %+22.14E, 0., d1};\n", $POINT[$i][1], $POINT[$i][2]); + } +# Les lignes + for ($i = 1 ; $i <= $nb_LINE ; $i++) { + printf OUFIC "Line ($i) = {$LINE[$i][1], $LINE[$i][2]};\n"; + } +# Les cercles + for ($i = 1 ; $i <= $nb_CIRCLE ; $i++) { + $j = $i + $nb_LINE; + printf OUFIC "Circle($j) = {$CIRCLE[$i][1], $CIRCLE[$i][2], $CIRCLE[$i][3]};\n"; + } +# Les ellipses + for ($i = 1 ; $i <= $nb_ELLI ; $i++) { + $j = $i + $nb_LINE + $nb_CIRCLE; + printf OUFIC "Ellipsis($j) = {$ELLI[$i][6], $ELLI[$i][1], $ELLI[$i][2], $ELLI[$i][7]};\n"; + } +# +}; +# +# ====================================================================== +# SORTIE vers GIBIANE +# ====================================================================== +# +sub sortie_gibi { +# si il y a des ellipses on place la routine GIBIANE de construction + if ($nb_ELLI != 0) {ecrit_proc_ellipse()}; +# Les options + printf OUFIC "* Options generales\n"; + printf OUFIC "OPTI DIME $dimen1 ELEM TRI3;\n"; + printf OUFIC "DENS $densi1;\n"; +# Les points + printf OUFIC "* Les Points\n"; + for ($i = 1 ; $i <= $nb_POINT ; $i++) { + if ($dimen1 == 2){ + printf OUFIC ("P$i = %13.5E %13.5E;\n", + $POINT[$i][1], $POINT[$i][2]); + } + else { + printf OUFIC ("P$i = %13.5E %13.5E %13.5E;\n", + $POINT[$i][1], $POINT[$i][2], 0.); + } + } +# Les lignes + printf OUFIC "* Les Lignes\n"; + + for ($i = 1 ; $i <= $nb_LINE ; $i++) { + printf OUFIC "L$i = DROI P$LINE[$i][1] P$LINE[$i][2];"; + if ($i == 1){ printf OUFIC "LT1 = L1;\n";} + else { printf OUFIC "LT1 = LT1 ET L$i;\n";} + } +# Les cercles + printf OUFIC "* Les Arcs de Cercle\n"; + for ($i = 1 ; $i <= $nb_CIRCLE ; $i++) { + $j = $i + $nb_LINE; + printf OUFIC "L$j = CERC P$CIRCLE[$i][1] P$CIRCLE[$i][2] P$CIRCLE[$i][3];"; + if ($j == 1){ printf OUFIC "LT1 = L1;\n";} + else { printf OUFIC "LT1 = LT1 ET L$j;\n";} + } +# Les ellispes + printf OUFIC "* Les Ellipses\n"; + for ($i = 1 ; $i <= $nb_ELLI ; $i++) { + $j = $i + $nb_LINE + $nb_CIRCLE; + printf OUFIC "L$j = ELLIPSE1 P$ELLI[$i][1] P$ELLI[$i][2]"; + printf OUFIC " P$ELLI[$i][6] P$ELLI[$i][7]\n"; + printf OUFIC " $ELLI[$i][3] $ELLI[$i][4] $ELLI[$i][5] ;\n"; + if ($j == 1){ printf OUFIC "LT1 = L1;\n";} + else { printf OUFIC "LT1 = LT1 ET L$j;\n";} + } +# Les multilignes + printf OUFIC "* Les Lignes complexes\n"; + for ($i = 1 ; $i <= $nb_LLINE ; $i++) { + printf OUFIC "LL$i = "; + for ($j = 1 ; $j <= $LLINE[$i][0] ; $j++) { + if ($LLINE[$i][$j] > 0){ + printf OUFIC "L$LLINE[$i][$j] "; + } + else { + $k = $nb_LINE - $LLINE[$i][$j]; + printf OUFIC "L$k "; + } + if ($j == $LLINE[$i][0]) {printf OUFIC ";\n"} + else { + printf OUFIC "ET "; + $l = $j - (6 * int($j / 6)); + if ($l == 0) {printf OUFIC "\n "}; + } + } + } +# +# +}; +# +# ====================================================================== +# SORTIE vers GIBIANE : ecriture de la procedure de creation +# des ellipses +# ====================================================================== +# +sub ecrit_proc_ellipse{ +printf OUFIC "debp ellipse1 c1*'POINT' c2*'POINT' "; +printf OUFIC "p1*'POINT' p2*'POINT'\n"; +printf OUFIC " a2*'FLOTTANT' u1*'FLOTTANT' u2*'FLOTTANT';\n"; +printf OUFIC "cx1 = coor 1 c1; cy1 = coor 2 c1;\n"; +printf OUFIC "cx2 = coor 1 c2; cy2 = coor 2 c2;\n"; +printf OUFIC "a1 = (((cx2 - cx1) ** 2) + ((cy2 - cy1) ** 2)) ** 0.5;\n"; +printf OUFIC "b1 = a1 * a2;\n"; +printf OUFIC "lo1 = (((a1 ** 2) + (b1 ** 2)) / 2.) ** 0.5;\n"; +printf OUFIC "lo2 = lo1 * (u2 - u1) * PI / 180.;\n"; +printf OUFIC "si (ega (vale dime) 2); n1 = ENTI (lo2 / (coor 3 c1));\n"; +printf OUFIC "sinon; n1 = ENTI (lo2 / (coor 4 c1)); finsi;\n"; +printf OUFIC "pr1 = prog u1 pas ((u2 - u1) / n1) u2;\n"; +printf OUFIC "prx0 = prog (n1 + 1) * cx1;\n"; +printf OUFIC "pry0 = prog (n1 + 1) * cy1;\n"; +printf OUFIC "thet1 = ATG (cy2 - cy1) (cx2 - cx1);\n"; +printf OUFIC "prx1 = (a1 * (cos pr1));\n"; +printf OUFIC "pry1 = (b1 * (sin pr1));\n"; +printf OUFIC "prx2 = prx0 + (prx1 * (cos thet1)) - (pry1 * (sin thet1));\n"; +printf OUFIC "pry2 = pry0 + (prx1 * (sin thet1)) + (pry1 * (cos thet1));\n"; +printf OUFIC "si (ega (vale dime) 2); l1 = quel seg2 prx2 pry2;\n"; +printf OUFIC "sinon ; prz0 = prog (n1 + 1) * 0.;\n"; +printf OUFIC " l1 = quel seg2 prx2 pry2 prz0;finsi;\n"; +printf OUFIC "elim (a1 / 1e3) l1 ((manu poi1 p1) et (manu poi1 p2));\n"; +printf OUFIC "finp l1;\n"; +}; +# +# ======================================================================= +# Sortie par defaut apres erreur +# ======================================================================= +# +sub sortie_usage { + print " \n"; + print "dxf2geo.pl : convertion DXF vers GEO (gmsh ou gibiane)\n"; + print "Laurent CHAMPANEY Novembre 2001\n"; + print " \n"; + print "Usage :\n"; + print " dxf2geo.pl [-d densite] [-e epsilon] [-v] \n"; + print " [-n dimension] [-s GIBI;GMSH] essai\n"; + print "Exemple :\n"; + print " perl dxf2geo.pl -d 2. -e 1E-4 -v essai\n"; + print " \n"; + print " lit essai.dxf et le converti en essai.geo\n"; + print " - en imposant une densite uniforme de 2 \n"; + print " - en utilisant un epsilon de 1E-4 pour les jonctions\n"; + print " - en visualisant des infos (-v)\n"; + print " \n"; + print " Elements g�om�triques support�s dans le fichier DXF : \n"; + print " - Lignes : LINE \n"; + print " - Polylignes : LWPOLYLIGNE \n"; + print " - Arcs : ARC \n"; + print " - Cercles : CIRCLE \n"; + print " - Ellipses : ELLIPSE \n"; + print " \n"; + return; + }; +