From ec0effcb646923f48c6c46e3974136a9506dd116 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Sat, 7 Jan 2006 18:42:39 +0000
Subject: [PATCH] slightly modified gui for transformations so that we can
 transform several entities at once

---
 Fltk/Callbacks.cpp | 164 ++++++++++++++++++++++----------------
 Geo/CAD.cpp        |  32 +++++---
 Geo/Geo.cpp        | 193 ++++++++++++++++++++++++++-------------------
 Geo/Geo.h          |  14 ++--
 4 files changed, 236 insertions(+), 167 deletions(-)

diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 8168a3d7e4..496e228686 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.390 2006-01-06 00:34:22 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.391 2006-01-07 18:42:39 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -2282,7 +2282,7 @@ static void _transform_point_line_surface(int transfo, int mode, char *what)
   Vertex *v[SELECTION_MAX_HITS];
   Curve *c[SELECTION_MAX_HITS];
   Surface *s[SELECTION_MAX_HITS];
-  int type, num = 0, ne;
+  int type, ne;
   char *str;
 
   if(!strcmp(what, "Point")) {
@@ -2302,7 +2302,9 @@ static void _transform_point_line_surface(int transfo, int mode, char *what)
   }
   Draw();
 
-  Msg(ONSCREEN, "Select %s\n[Press 'q' to abort]", str);
+  Msg(ONSCREEN, "Select %s\n[Press 'e' to end or 'q' to abort]", str);
+
+  List_T *List1 = List_Create(5, 5, sizeof(int));
 
   while(1) {
     Msg(STATUS3N, "Transforming %s", str);
@@ -2312,75 +2314,105 @@ static void _transform_point_line_surface(int transfo, int mode, char *what)
       Draw();
       break;
     }
+    if(ib == 'r') {
+      for(int i = 0; i < ne; i++){
+	switch (type) {
+	case ENT_POINT:
+	  List_Suppress(List1, &v[i]->Num, fcmp_int);
+	  ZeroHighlightEntity(v[i], NULL, NULL);
+	  break;
+	case ENT_LINE:
+	  List_Suppress(List1, &c[i]->Num, fcmp_int);
+	  ZeroHighlightEntity(NULL, c[i], NULL);
+	  break;
+	case ENT_SURFACE:
+	  List_Suppress(List1, &s[i]->Num, fcmp_int);
+	  ZeroHighlightEntity(NULL, NULL, s[i]);
+	  break;
+	}
+      }
+      Draw();
+    }
     if(ib == 'l') {
-      switch (type) {
-      case ENT_POINT:
-	num = v[0]->Num;
-	break;
-      case ENT_LINE:
-	num = c[0]->Num;
-	break;
-      case ENT_SURFACE:
-	num = s[0]->Num;
-	break;
+      for(int i = 0; i < ne; i++){
+	switch (type) {
+	case ENT_POINT:   List_Add(List1, &v[i]->Num); break;
+	case ENT_LINE:    List_Add(List1, &c[i]->Num); break;
+	case ENT_SURFACE: List_Add(List1, &s[i]->Num); break;
+	}
       }
-      switch (transfo) {
-      case 0:
-	translate(mode, num, CTX.filename, what,
-		  (char*)WID->context_geometry_input[6]->value(),
-		  (char*)WID->context_geometry_input[7]->value(),
-		  (char*)WID->context_geometry_input[8]->value());
-	break;
-      case 1:
-	rotate(mode, num, CTX.filename, what,
-	       (char*)WID->context_geometry_input[12]->value(),
-	       (char*)WID->context_geometry_input[13]->value(),
-	       (char*)WID->context_geometry_input[14]->value(),
-	       (char*)WID->context_geometry_input[9]->value(),
-	       (char*)WID->context_geometry_input[10]->value(),
-	       (char*)WID->context_geometry_input[11]->value(),
-	       (char*)WID->context_geometry_input[15]->value());
-	break;
-      case 2:
-	dilate(mode, num, CTX.filename, what,
-	       (char*)WID->context_geometry_input[16]->value(),
-	       (char*)WID->context_geometry_input[17]->value(),
-	       (char*)WID->context_geometry_input[18]->value(),
-	       (char*)WID->context_geometry_input[19]->value());
-	break;
-      case 3:
-	symmetry(mode, num, CTX.filename, what,
-		 (char*)WID->context_geometry_input[20]->value(),
-		 (char*)WID->context_geometry_input[21]->value(),
-		 (char*)WID->context_geometry_input[22]->value(),
-		 (char*)WID->context_geometry_input[23]->value());
-	break;
-      case 4:
-	extrude(num, CTX.filename, what,
-		(char*)WID->context_geometry_input[6]->value(),
-		(char*)WID->context_geometry_input[7]->value(),
-		(char*)WID->context_geometry_input[8]->value());
-	break;
-      case 5:
-	protude(num, CTX.filename, what,
-		(char*)WID->context_geometry_input[12]->value(),
-		(char*)WID->context_geometry_input[13]->value(),
-		(char*)WID->context_geometry_input[14]->value(),
-		(char*)WID->context_geometry_input[9]->value(),
-		(char*)WID->context_geometry_input[10]->value(),
-		(char*)WID->context_geometry_input[11]->value(),
-		(char*)WID->context_geometry_input[15]->value());
-	break;
-      case 6:
-	delet(num, CTX.filename, what);
-	break;
+    }
+    if(ib == 'e') {
+      if(List_Nbr(List1)){
+	switch (transfo) {
+	case 0:
+	  translate(mode, List1, CTX.filename, what,
+		    (char*)WID->context_geometry_input[6]->value(),
+		    (char*)WID->context_geometry_input[7]->value(),
+		    (char*)WID->context_geometry_input[8]->value());
+	  break;
+	case 1:
+	  rotate(mode, List1, CTX.filename, what,
+		 (char*)WID->context_geometry_input[12]->value(),
+		 (char*)WID->context_geometry_input[13]->value(),
+		 (char*)WID->context_geometry_input[14]->value(),
+		 (char*)WID->context_geometry_input[9]->value(),
+		 (char*)WID->context_geometry_input[10]->value(),
+		 (char*)WID->context_geometry_input[11]->value(),
+		 (char*)WID->context_geometry_input[15]->value());
+	  break;
+	case 2:
+	  dilate(mode, List1, CTX.filename, what,
+		 (char*)WID->context_geometry_input[16]->value(),
+		 (char*)WID->context_geometry_input[17]->value(),
+		 (char*)WID->context_geometry_input[18]->value(),
+		 (char*)WID->context_geometry_input[19]->value());
+	  break;
+	case 3:
+	  symmetry(mode, List1, CTX.filename, what,
+		   (char*)WID->context_geometry_input[20]->value(),
+		   (char*)WID->context_geometry_input[21]->value(),
+		   (char*)WID->context_geometry_input[22]->value(),
+		   (char*)WID->context_geometry_input[23]->value());
+	  break;
+	case 4:
+	  for(int i = 0; i < List_Nbr(List1); i++){
+	    int num;
+	    List_Read(List1, i, &num);
+	    extrude(num, CTX.filename, what,
+		    (char*)WID->context_geometry_input[6]->value(),
+		    (char*)WID->context_geometry_input[7]->value(),
+		    (char*)WID->context_geometry_input[8]->value());
+	  }
+	  break;
+	case 5:
+	  for(int i = 0; i < List_Nbr(List1); i++){
+	    int num;
+	    List_Read(List1, i, &num);
+	    protude(num, CTX.filename, what,
+		    (char*)WID->context_geometry_input[12]->value(),
+		    (char*)WID->context_geometry_input[13]->value(),
+		    (char*)WID->context_geometry_input[14]->value(),
+		    (char*)WID->context_geometry_input[9]->value(),
+		    (char*)WID->context_geometry_input[10]->value(),
+		    (char*)WID->context_geometry_input[11]->value(),
+		    (char*)WID->context_geometry_input[15]->value());
+	  }
+	  break;
+	case 6:
+	  delet(List1, CTX.filename, what);
+	  break;
+	}
+	List_Reset(List1);
+	ZeroHighlight(THEM);
+	CalculateMinMax(THEM->Points, NULL);
+	Draw();
       }
-      ZeroHighlight(THEM);
-      CalculateMinMax(THEM->Points, NULL);
-      Draw();
     }
   }
 
+  List_Delete(List1);
+
   Msg(STATUS3N, "Ready");
   Msg(ONSCREEN, "");
 }
diff --git a/Geo/CAD.cpp b/Geo/CAD.cpp
index 8af61d0227..3fab8023cd 100644
--- a/Geo/CAD.cpp
+++ b/Geo/CAD.cpp
@@ -1,4 +1,4 @@
-// $Id: CAD.cpp,v 1.89 2006-01-07 18:19:34 geuzaine Exp $
+// $Id: CAD.cpp,v 1.90 2006-01-07 18:42:39 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -247,6 +247,15 @@ Vertex *DuplicateVertex(Vertex * v)
   return pv;
 }
 
+int compareAbsCurve(const void *a, const void *b)
+{
+  Curve **q, **w;
+
+  q = (Curve **) a;
+  w = (Curve **) b;
+  return (abs((*q)->Num) - abs((*w)->Num));
+}
+
 void CopyCurve(Curve * c, Curve * cc)
 {
   int i, j;
@@ -414,8 +423,10 @@ void DeletePoint(int ip)
     Curve *c;
     List_Read(Curves, i, &c);
     for(int j = 0; j < List_Nbr(c->Control_Points); j++) {
-      if(!compareVertex(List_Pointer(c->Control_Points, j), &v))
+      if(!compareVertex(List_Pointer(c->Control_Points, j), &v)){
+	List_Delete(Curves);
         return;
+      }
     }
   }
   List_Delete(Curves);
@@ -435,8 +446,10 @@ void DeleteCurve(int ip)
     Surface *s;
     List_Read(Surfs, i, &s);
     for(int j = 0; j < List_Nbr(s->Generatrices); j++) {
-      if(!compareCurve(List_Pointer(s->Generatrices, j), &c))
+      if(!compareAbsCurve(List_Pointer(s->Generatrices, j), &c)){
+	List_Delete(Surfs);
         return;
+      }
     }
   }
   List_Delete(Surfs);
@@ -456,8 +469,10 @@ void DeleteSurface(int is)
     Volume *v;
     List_Read(Vols, i, &v);
     for(int j = 0; j < List_Nbr(v->Surfaces); j++) {
-      if(!compareSurface(List_Pointer(v->Surfaces, j), &s))
+      if(!compareSurface(List_Pointer(v->Surfaces, j), &s)){
+	List_Delete(Vols);
         return;
+      }
     }
   }
   List_Delete(Vols);
@@ -1670,15 +1685,6 @@ int compareTwoCurves(const void *a, const void *b)
   return 0;
 }
 
-int compareAbsCurve(const void *a, const void *b)
-{
-  Curve **q, **w;
-
-  q = (Curve **) a;
-  w = (Curve **) b;
-  return (abs((*q)->Num) - abs((*w)->Num));
-}
-
 int compareTwoSurfaces(const void *a, const void *b)
 {
   Surface *s1, *s2;
diff --git a/Geo/Geo.cpp b/Geo/Geo.cpp
index fb39520635..a744e4783c 100644
--- a/Geo/Geo.cpp
+++ b/Geo/Geo.cpp
@@ -1,4 +1,4 @@
-// $Id: Geo.cpp,v 1.45 2006-01-06 00:34:24 geuzaine Exp $
+// $Id: Geo.cpp,v 1.46 2006-01-07 18:42:39 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -104,22 +104,38 @@ void coherence(char *fich)
   add_infile("Coherence;", fich);
 }
 
-void delet(int p1, char *fich, char *what)
+void strncat_list(char *text, List_T *list)
+{
+  char text2[BUFFSIZE];
+  for(int i = 0; i < List_Nbr(list); i++){
+    int num;
+    List_Read(list, i, &num);
+    if(!i)
+      snprintf(text2, BUFFSIZE, "%d", num);
+    else
+      snprintf(text2, BUFFSIZE, ",%d", num);
+    strncat(text, text2, BUFFSIZE-strlen(text));
+  }
+}
+
+void delet(List_T *list, char *fich, char *what)
 {
   char text[BUFFSIZE];
 
-  snprintf(text, BUFFSIZE, "Delete {\n  %s{%d};\n}", what, p1);
+  snprintf(text, BUFFSIZE, "Delete {\n  %s{", what);
+  strncat_list(text, list);
+  strncat(text, "};\n}", BUFFSIZE-strlen(text));
+
   add_infile(text, fich);
 }
 
 void add_trsfellisurf(int type, int N, int *l, char *fich, char *dir)
 {
-  char text[BUFFSIZE];
-  char text2[BUFFSIZE];
-  int i;
+  char text[BUFFSIZE], text2[BUFFSIZE];
+
   snprintf(text, BUFFSIZE, "%s Surface {%d} = {", 
 	   type ? "Elliptic" : "Transfinite", l[0]);
-  for(i = 1; i < N; i++) {
+  for(int i = 1; i < N; i++) {
     if(i == 1)
       snprintf(text2, BUFFSIZE, "%d", l[i]);
     else
@@ -137,11 +153,10 @@ void add_trsfellisurf(int type, int N, int *l, char *fich, char *dir)
 
 void add_charlength(int N, int *l, char *fich, char *lc)
 {
-  char text[BUFFSIZE];
-  char text2[BUFFSIZE];
-  int i;
+  char text[BUFFSIZE], text2[BUFFSIZE];
+
   snprintf(text, BUFFSIZE, "Characteristic Length {");
-  for(i = 0; i < N; i++) {
+  for(int i = 0; i < N; i++) {
     if(i == 0)
       snprintf(text2, BUFFSIZE, "%d", l[i]);
     else
@@ -155,11 +170,10 @@ void add_charlength(int N, int *l, char *fich, char *lc)
 
 void add_recosurf(int N, int *l, char *fich)
 {
-  char text[BUFFSIZE];
-  char text2[BUFFSIZE];
-  int i;
+  char text[BUFFSIZE], text2[BUFFSIZE];
+
   snprintf(text, BUFFSIZE, "Recombine Surface {");
-  for(i = 0; i < N; i++) {
+  for(int i = 0; i < N; i++) {
     if(i == 0)
       snprintf(text2, BUFFSIZE, "%d", l[i]);
     else
@@ -174,11 +188,10 @@ void add_recosurf(int N, int *l, char *fich)
 
 void add_trsfline(int N, int *l, char *fich, char *type, char *typearg, char *pts)
 {
-  char text[BUFFSIZE];
-  char text2[BUFFSIZE];
-  int i;
+  char text[BUFFSIZE], text2[BUFFSIZE];
+
   snprintf(text, BUFFSIZE, "Transfinite Line {");
-  for(i = 0; i < N; i++) {
+  for(int i = 0; i < N; i++) {
     if(!i)
       snprintf(text2, BUFFSIZE, "%d", l[i]);
     else
@@ -261,12 +274,10 @@ void add_ell(int p1, int p2, int p3, int p4, char *fich)
 
 void add_spline(int N, int *p, char *fich)
 {
-  char text[BUFFSIZE];
-  char text2[BUFFSIZE];
-  int i;
+  char text[BUFFSIZE], text2[BUFFSIZE];
 
   snprintf(text, BUFFSIZE, "CatmullRom(%d) = {", NEWLINE());
-  for(i = 0; i < N; i++) {
+  for(int i = 0; i < N; i++) {
     if(i != N - 1)
       snprintf(text2, BUFFSIZE, "%d,", p[i]);
     else
@@ -278,12 +289,10 @@ void add_spline(int N, int *p, char *fich)
 
 void add_bezier(int N, int *p, char *fich)
 {
-  char text[BUFFSIZE];
-  char text2[BUFFSIZE];
-  int i;
+  char text[BUFFSIZE], text2[BUFFSIZE];
 
   snprintf(text, BUFFSIZE, "Bezier(%d) = {", NEWLINE());
-  for(i = 0; i < N; i++) {
+  for(int i = 0; i < N; i++) {
     if(i != N - 1)
       snprintf(text2, BUFFSIZE, "%d,", p[i]);
     else
@@ -296,12 +305,10 @@ void add_bezier(int N, int *p, char *fich)
 
 void add_bspline(int N, int *p, char *fich)
 {
-  char text[BUFFSIZE];
-  char text2[BUFFSIZE];
-  int i;
+  char text[BUFFSIZE], text2[BUFFSIZE];
 
   snprintf(text, BUFFSIZE, "BSpline(%d) = {", NEWLINE());
-  for(i = 0; i < N; i++) {
+  for(int i = 0; i < N; i++) {
     if(i != N - 1)
       snprintf(text2, BUFFSIZE, "%d,", p[i]);
     else
@@ -313,13 +320,11 @@ void add_bspline(int N, int *p, char *fich)
 
 void add_multline(int N, int *p, char *fich)
 {
-  char text[BUFFSIZE];
-  char text2[BUFFSIZE];
-  int i;
-
+  char text[BUFFSIZE], text2[BUFFSIZE];
   int iseg;
+
   List_T *list = List_Create(N, 2, sizeof(int));
-  for(i = 0; i < N; i++)
+  for(int i = 0; i < N; i++)
     List_Add(list, &p[i]);
   if((recognize_seg(MSH_SEGM_LINE, list, &iseg))) {
     List_Delete(list);
@@ -328,7 +333,7 @@ void add_multline(int N, int *p, char *fich)
   List_Delete(list);
 
   snprintf(text, BUFFSIZE, "Line(%d) = {", NEWLINE());
-  for(i = 0; i < N; i++) {
+  for(int i = 0; i < N; i++) {
     if(i != N - 1)
       snprintf(text2, BUFFSIZE, "%d,", p[i]);
     else
@@ -340,16 +345,15 @@ void add_multline(int N, int *p, char *fich)
 
 void add_loop(List_T * list, char *fich, int *numloop)
 {
-  char text[BUFFSIZE];
-  char text2[BUFFSIZE];
-  int i, seg;
+  char text[BUFFSIZE], text2[BUFFSIZE];
+  int seg;
 
   if((recognize_loop(list, numloop)))
     return;
 
   *numloop = NEWLINELOOP();
   snprintf(text, BUFFSIZE, "Line Loop(%d) = {", *numloop);
-  for(i = 0; i < List_Nbr(list); i++) {
+  for(int i = 0; i < List_Nbr(list); i++) {
     List_Read(list, i, &seg);
     if(i != List_Nbr(list) - 1)
       snprintf(text2, BUFFSIZE, "%d,", seg);
@@ -363,9 +367,8 @@ void add_loop(List_T * list, char *fich, int *numloop)
 
 void add_surf(List_T * list, char *fich, int support, int typ)
 {
-  char text[BUFFSIZE];
-  char text2[BUFFSIZE];
-  int i, seg;
+  char text[BUFFSIZE], text2[BUFFSIZE];
+  int seg;
 
   if(typ == 1) {
     snprintf(text, BUFFSIZE, "Ruled Surface(%d) = {", NEWSURFACE());
@@ -377,7 +380,7 @@ void add_surf(List_T * list, char *fich, int support, int typ)
     snprintf(text, BUFFSIZE, "Trimmed Surface(%d) = %d {", NEWSURFACE(),
              support);
   }
-  for(i = 0; i < List_Nbr(list); i++) {
+  for(int i = 0; i < List_Nbr(list); i++) {
     List_Read(list, i, &seg);
     if(i != List_Nbr(list) - 1)
       snprintf(text2, BUFFSIZE, "%d,", seg);
@@ -388,18 +391,17 @@ void add_surf(List_T * list, char *fich, int support, int typ)
   add_infile(text, fich);
 }
 
-void add_vol(List_T * list, char *fich, int *numvol)
+void add_vol(List_T *list, char *fich, int *numvol)
 {
-  char text[BUFFSIZE];
-  char text2[BUFFSIZE];
-  int i, seg;
+  char text[BUFFSIZE], text2[BUFFSIZE];
+  int seg;
 
   if((recognize_surfloop(list, numvol)))
     return;
 
   *numvol = NEWSURFACELOOP();
   snprintf(text, BUFFSIZE, "Surface Loop(%d) = {", *numvol);
-  for(i = 0; i < List_Nbr(list); i++) {
+  for(int i = 0; i < List_Nbr(list); i++) {
     List_Read(list, i, &seg);
     if(i != List_Nbr(list) - 1)
       snprintf(text2, BUFFSIZE, "%d,", seg);
@@ -410,14 +412,13 @@ void add_vol(List_T * list, char *fich, int *numvol)
   add_infile(text, fich);
 }
 
-void add_multvol(List_T * list, char *fich)
+void add_multvol(List_T *list, char *fich)
 {
-  char text[BUFFSIZE];
-  char text2[BUFFSIZE];
-  int i, seg;
+  char text[BUFFSIZE], text2[BUFFSIZE];
+  int seg;
 
   snprintf(text, BUFFSIZE, "Volume(%d) = {", NEWVOLUME());
-  for(i = 0; i < List_Nbr(list); i++) {
+  for(int i = 0; i < List_Nbr(list); i++) {
     List_Read(list, i, &seg);
     if(i != List_Nbr(list) - 1)
       snprintf(text2, BUFFSIZE, "%d,", seg);
@@ -431,10 +432,9 @@ void add_multvol(List_T * list, char *fich)
 void add_trsfvol(int N, int *l, char *fich, char *vol)
 {
   char text[BUFFSIZE], text2[BUFFSIZE];
-  int i;
 
   snprintf(text, BUFFSIZE, "Transfinite Volume{%s} = {", vol);
-  for(i = 0; i < N; i++) {
+  for(int i = 0; i < N; i++) {
     if(i == 0)
       snprintf(text2, BUFFSIZE, "%d", l[i]);
     else
@@ -450,7 +450,7 @@ void add_trsfvol(int N, int *l, char *fich, char *vol)
 void add_physical(List_T * list, char *fich, int type, int *num)
 {
   char text[BUFFSIZE], text2[BUFFSIZE];
-  int i, elementary_entity;
+  int elementary_entity;
 
   *num = NEWPHYSICAL();
   switch (type) {
@@ -468,7 +468,7 @@ void add_physical(List_T * list, char *fich, int type, int *num)
     break;
   }
 
-  for(i = 0; i < List_Nbr(list); i++) {
+  for(int i = 0; i < List_Nbr(list); i++) {
     List_Read(list, i, &elementary_entity);
     if(i != List_Nbr(list) - 1)
       snprintf(text2, BUFFSIZE, "%d,", elementary_entity);
@@ -479,59 +479,86 @@ void add_physical(List_T * list, char *fich, int type, int *num)
   add_infile(text, fich);
 }
 
-void translate(int add, int s, char *fich, char *what, char *tx, char *ty, char *tz)
+void translate(int add, List_T *list, char *fich, char *what, char *tx, char *ty, char *tz)
 {
-  char text[BUFFSIZE];
+  char text[BUFFSIZE], text2[BUFFSIZE];
+
+  if(add)
+    snprintf(text, BUFFSIZE, "Translate {%s,%s,%s} {\n  Duplicata { %s{", tx, ty, tz, what);
+  else
+    snprintf(text, BUFFSIZE, "Translate {%s,%s,%s} {\n  %s{", tx, ty, tz, what);
 
+  strncat_list(text, list);
+  
   if(add)
-    snprintf(text, BUFFSIZE,
-             "Translate {%s,%s,%s} {\n  Duplicata { %s{%d}; }\n}", tx, ty, tz, what, s);
+    strncat(text, "}; }\n}", BUFFSIZE-strlen(text));
   else
-    snprintf(text, BUFFSIZE, "Translate {%s,%s,%s} {\n  %s{%d};\n}", tx, ty, tz, what, s);
+    strncat(text, "};\n}", BUFFSIZE-strlen(text));
+
   add_infile(text, fich);
 }
 
-void rotate(int add, int s, char *fich, char *what, char *ax, char *ay, char *az,
+void rotate(int add, List_T *list, char *fich, char *what, char *ax, char *ay, char *az,
 	    char *px, char *py, char *pz, char *angle)
 {
   char text[BUFFSIZE];
 
   if(add)
-    snprintf(text, BUFFSIZE,
-             "Rotate { {%s,%s,%s},{%s,%s,%s},%s } {\n  Duplicata { %s{%d}; }\n}",
-             ax, ay, az, px, py, pz, angle, what, s);
+    snprintf(text, BUFFSIZE, "Rotate { {%s,%s,%s},{%s,%s,%s},%s } {\n  Duplicata { %s{",
+             ax, ay, az, px, py, pz, angle, what);
   else
-    snprintf(text, BUFFSIZE,
-             "Rotate { {%s,%s,%s},{%s,%s,%s},%s } {\n  %s{%d};\n}",
-             ax, ay, az, px, py, pz, angle, what, s);
+    snprintf(text, BUFFSIZE, "Rotate { {%s,%s,%s},{%s,%s,%s},%s } {\n  %s{",
+             ax, ay, az, px, py, pz, angle, what);
+
+  strncat_list(text, list);
+
+  if(add)
+    strncat(text, "}; }\n}", BUFFSIZE-strlen(text));
+  else
+    strncat(text, "};\n}", BUFFSIZE-strlen(text));
+
   add_infile(text, fich);
 }
 
-void dilate(int add, int s, char *fich, char *what, char *dx, char *dy, char *dz, char *df)
+void dilate(int add, List_T *list, char *fich, char *what, char *dx, char *dy, char *dz, char *df)
 {
   char text[BUFFSIZE];
 
   if(add)
-    snprintf(text, BUFFSIZE,
-             "Dilate { {%s,%s,%s},%s } {\n  Duplicata { %s{%d}; }\n}",
-             dx, dy, dz, df, what, s);
+    snprintf(text, BUFFSIZE, "Dilate { {%s,%s,%s},%s } {\n  Duplicata { %s{",
+             dx, dy, dz, df, what);
+  else
+    snprintf(text, BUFFSIZE, "Dilate { {%s,%s,%s},%s } {\n  %s{",
+             dx, dy, dz, df, what);
+
+  strncat_list(text, list);
+
+  if(add)
+    strncat(text, "}; }\n}", BUFFSIZE-strlen(text));
   else
-    snprintf(text, BUFFSIZE, "Dilate { {%s,%s,%s},%s } {\n  %s{%d};\n}",
-             dx, dy, dz, df, what, s);
+    strncat(text, "};\n}", BUFFSIZE-strlen(text));
+
   add_infile(text, fich);
 }
 
-void symmetry(int add, int s, char *fich, char *what, char *sa, char *sb, char *sc, char *sd)
+void symmetry(int add, List_T *list, char *fich, char *what, char *sa, char *sb, char *sc, char *sd)
 {
   char text[BUFFSIZE];
 
   if(add)
-    snprintf(text, BUFFSIZE,
-             "Symmetry { %s,%s,%s,%s } {\n  Duplicata { %s{%d}; }\n}",
-             sa, sb, sc, sd, what, s);
+    snprintf(text, BUFFSIZE, "Symmetry { %s,%s,%s,%s } {\n  Duplicata { %s{",
+             sa, sb, sc, sd, what);
   else
-    snprintf(text, BUFFSIZE, "Symmetry { %s,%s,%s,%s } {\n  %s{%d};\n}",
-             sa, sb, sc, sd, what, s);
+    snprintf(text, BUFFSIZE, "Symmetry { %s,%s,%s,%s } {\n  %s{",
+             sa, sb, sc, sd, what);
+
+  strncat_list(text, list);
+
+  if(add)
+    strncat(text, "}; }\n}", BUFFSIZE-strlen(text));
+  else
+    strncat(text, "};\n}", BUFFSIZE-strlen(text));
+
   add_infile(text, fich);
 }
 
diff --git a/Geo/Geo.h b/Geo/Geo.h
index a6140caab9..72ce92ac08 100644
--- a/Geo/Geo.h
+++ b/Geo/Geo.h
@@ -96,7 +96,7 @@ typedef struct {
 double evaluate_scalarfunction (char *var, double val, char *funct);
 
 void coherence(char *fich);
-void delet(int p1, char *fich, char *what);
+void delet(List_T *list, char *fich, char *what);
 void add_infile(char *text, char *fich);
 void add_trsfline(int N, int *l, char *fich, char *type, char *typearg, char *pts);
 void add_trsfellisurf(int type, int N, int *l, char *fich, char *dir);
@@ -118,11 +118,15 @@ void add_surf(List_T *list, char *fich, int support, int typ);
 void add_vol(List_T *list, char *fich, int *numvol);
 void add_multvol(List_T *list, char *fich);
 void add_physical(List_T *list, char *fich, int type, int *num);
-void translate(int add, int s, char *fich, char *what, char *tx, char *ty, char *tz);
-void rotate(int add, int s, char *fich, char *what, char *ax, char *ay, char *az,
+void translate(int add, List_T *list, char *fich, char *what,
+	       char *tx, char *ty, char *tz);
+void rotate(int add, List_T *list, char *fich, char *what, 
+	    char *ax, char *ay, char *az,
 	    char *px, char *py, char *pz, char *angle);
-void dilate(int add, int s, char *fich, char *what, char *dx, char *dy, char *dz, char *df);
-void symmetry(int add, int s, char *fich, char *what, char *sa, char *sb, char *sc, char *sd);
+void dilate(int add, List_T *list, char *fich, char *what,
+	    char *dx, char *dy, char *dz, char *df);
+void symmetry(int add, List_T *list, char *fich, char *what, 
+	      char *sa, char *sb, char *sc, char *sd);
 void extrude(int s, char *fich, char *what, char *tx, char *ty, char *tz);
 void protude(int s, char *fich, char *what, char *ax, char *ay, char *az,
 	     char *px, char *py, char *pz, char *angle);
-- 
GitLab