[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Question about the polyline object...



Gday,

	First up, thanks for creating a great tool. I am currently using it for 
schematic diagrams and I find dia quite usefull.

	However, the niceties aside, I am trying to get the xfig importer back 
into shape but I have run across a snag. Currenly the xfig importer 
doesnt *seem* to import xfig polylines. The reson, as it appears to me, 
is that there doesnt seem to be an appropriate API to permit the loading 
of the actual polyline points into the polyline object. I understand how 
to create an instance of a polyline (using
ObjectType->ops->Create(...) etc) BUT, loading the actual points into 
the object seems to be impossible. All I get is the two default points, 
one at the point given to create() and another at px+1 and py+1.

	The same problem seems to apply to beziergons and just about any object 
that can have a variable number of points.

	So my question, have I missed something? Is there a specifical call to 
manipulate the points stored in an object? If not, then what are the 
current plans on the table for implementing point manipulation 
interfaces in dia objects?

	Secondly, I have also attached a patch to 0.88.1 to permit the setting of 
the zigzag line orientation. I have already sent this patch to Alex 
Larsson but I have not recieved any comment on it, so I am sending it to 
the list.

'Ave fun...

Cheers Mik.

	
diff -ur dia-0.88.1/lib/orth_conn.c dia-0.88.1mv/lib/orth_conn.c
--- dia-0.88.1/lib/orth_conn.c	Mon Mar 26 11:05:21 2001
+++ dia-0.88.1mv/lib/orth_conn.c	Sun Aug 25 15:07:26 2002
@@ -30,9 +30,13 @@
 
 enum change_type {
   TYPE_ADD_SEGMENT,
-  TYPE_REMOVE_SEGMENT
+  TYPE_REMOVE_SEGMENT,
+  TYPE_ORIENT_VERT,
+  TYPE_ORIENT_HORIZ
 };
 
+static enum change_type orthconn_orientation = TYPE_ORIENT_HORIZ;
+
 static ObjectChange *
 midsegment_create_change(OrthConn *orth, enum change_type type,
 			 int segment,
@@ -88,6 +92,17 @@
 			  remove segment */
 };
 
+static ObjectChange *
+orient_change_create(OrthConn *orth, enum change_type change);
+
+struct OrientChange
+{
+    ObjectChange obj_change;
+    enum change_type type;
+    int applied;
+    enum change_type previous_value;
+};
+
 
 static void set_midpoint(Point *point, OrthConn *orth, int segment)
 {
@@ -399,18 +414,33 @@
   obj->handles[2] = orth->handles[2];
 
   /* Just so we have some position: */
-  orth->points[0] = *startpoint;
-  orth->points[1].x = startpoint->x;
-  orth->points[1].y = startpoint->y + 1.0;
-  orth->points[2].x = startpoint->x + 1.0;
-  orth->points[2].y = startpoint->y + 1.0;
-  orth->points[3].x = startpoint->x + 2.0;
-  orth->points[3].y = startpoint->y + 1.0;
-
-  orth->orientation[0] = VERTICAL;
-  orth->orientation[1] = HORIZONTAL;
-  orth->orientation[2] = VERTICAL;
-
+  if (orthconn_orientation == TYPE_ORIENT_HORIZ)
+  {
+    orth->points[0] = *startpoint;
+    orth->points[1].x = startpoint->x;
+    orth->points[1].y = startpoint->y + 1.0;
+    orth->points[2].x = startpoint->x + 1.0;
+    orth->points[2].y = startpoint->y + 1.0;
+    orth->points[3].x = startpoint->x + 2.0;
+    orth->points[3].y = startpoint->y + 1.0;
+
+    orth->orientation[0] = VERTICAL;
+    orth->orientation[1] = HORIZONTAL;
+    orth->orientation[2] = VERTICAL;
+  } else
+  {
+    orth->points[0] = *startpoint;
+    orth->points[1].x = startpoint->x + 1.0;
+    orth->points[1].y = startpoint->y;
+    orth->points[2].x = startpoint->x + 1.0;
+    orth->points[2].y = startpoint->y + 1.0;
+    orth->points[3].x = startpoint->x + 1.0;
+    orth->points[3].y = startpoint->y + 2.0;
+
+    orth->orientation[0] = HORIZONTAL;
+    orth->orientation[1] = VERTICAL;
+    orth->orientation[2] = HORIZONTAL;
+  }
   orthconn_update_data(orth);
 }
 
@@ -662,6 +692,26 @@
   return change;
 }
 
+ObjectChange *
+orthconn_orient_vert(OrthConn *orth, Point *clicked)
+{
+    ObjectChange *change = NULL;
+    
+    change = orient_change_create(orth, TYPE_ORIENT_VERT);
+    change->apply(change, (Object *) orth);
+    return change;
+}
+
+ObjectChange *
+orthconn_orient_horiz(OrthConn *orth, Point *clicked)
+{
+    ObjectChange *change = NULL;
+    
+    change = orient_change_create(orth, TYPE_ORIENT_HORIZ);
+    change->apply(change, (Object *) orth);
+    return change;
+}
+
 static void
 delete_point(OrthConn *orth, int pos)
 {
@@ -790,6 +840,8 @@
 			    HANDLE_MOVE_ENDPOINT);
     }
     break;
+    default:
+    break;
   }
 }
 
@@ -831,6 +883,8 @@
     if (change->cp) 
       object_connect(obj, change->old_end_handle, change->cp);
     break;
+    default:
+    break;
   }
   change->applied = 0;
 }
@@ -903,6 +957,8 @@
       orth->points[change->segment].y = change->points[0].y;
     }
     break;
+    default:
+    break;
   }
 }
 
@@ -931,6 +987,8 @@
     insert_handle(orth, change->segment, change->handles[0],
 		  FLIP_ORIENT(orth->orientation[change->segment-1]) );
     break;
+    default:
+    break;
   }
   change->applied = 0;
 }
@@ -961,5 +1019,47 @@
 }
 
 
+static void orient_change_free(struct OrientChange *change)
+{
+}
+
+static void orient_change_apply(struct OrientChange *change, Object *obj)
+{
+    change->applied = 1;
+    
+    switch (change->type)
+    {
+	case TYPE_ORIENT_HORIZ:
+	    orthconn_orientation = TYPE_ORIENT_HORIZ;
+	    break;
+	case TYPE_ORIENT_VERT:
+	    orthconn_orientation = TYPE_ORIENT_VERT;
+	    break;
+	default:
+	    break;
+    }
+        	    
+}
 
+static void orient_change_revert(struct OrientChange *change, Object *obj)
+{
+    change->applied = 0;
+    orthconn_orientation = change->previous_value;
+}
 
+static ObjectChange *
+orient_change_create(OrthConn *orth, enum change_type type)
+{
+    struct OrientChange *change;
+    
+    change = g_new(struct OrientChange, 1);
+    
+    change->obj_change.apply = (ObjectChangeApplyFunc) orient_change_apply;
+    change->obj_change.revert = (ObjectChangeRevertFunc) orient_change_revert;
+    change->obj_change.free = (ObjectChangeFreeFunc) orient_change_free;
+    
+    change->type = type;
+    change->previous_value = orthconn_orientation;
+    change->applied = 0;
+    return (ObjectChange *)change;
+}
diff -ur dia-0.88.1/lib/orth_conn.h dia-0.88.1mv/lib/orth_conn.h
--- dia-0.88.1/lib/orth_conn.h	Sat Feb 24 01:45:45 2001
+++ dia-0.88.1mv/lib/orth_conn.h	Sun Aug 25 14:35:01 2002
@@ -78,6 +78,8 @@
 int orthconn_can_add_segment(OrthConn *orth, Point *clickedpoint);
 ObjectChange *orthconn_delete_segment(OrthConn *orth, Point *clickedpoint);
 ObjectChange *orthconn_add_segment(OrthConn *orth, Point *clickedpoint);
+ObjectChange *orthconn_orient_vert(OrthConn *orth, Point *clickedpoint);
+ObjectChange *orthconn_orient_horiz(OrthConn *orth, Point *clickedpoint);
 #endif /* ORTH_CONN_H */
 
 
Only in dia-0.88.1mv: libtool
diff -ur dia-0.88.1/objects/standard/zigzagline.c dia-0.88.1mv/objects/standard/zigzagline.c
--- dia-0.88.1/objects/standard/zigzagline.c	Tue May  1 10:56:01 2001
+++ dia-0.88.1mv/objects/standard/zigzagline.c	Sun Aug 25 14:58:35 2002
@@ -335,9 +335,29 @@
   return change;
 }
 
+static ObjectChange *
+zigzagline_vertical_callback(Object *obj, Point *clicked, gpointer data)
+{
+    ObjectChange *change = NULL;
+    change = orthconn_orient_vert((OrthConn *)obj, clicked);
+    return change;
+}
+
+static ObjectChange *
+zigzagline_horizontal_callback(Object *obj, Point *clicked, gpointer data)
+{
+    ObjectChange *change = NULL;
+    change = orthconn_orient_horiz((OrthConn *)obj, clicked);
+    return change;
+}
+
+
 static DiaMenuItem object_menu_items[] = {
   { N_("Add segment"), zigzagline_add_segment_callback, NULL, 1 },
   { N_("Delete segment"), zigzagline_delete_segment_callback, NULL, 1 },
+  { NULL, NULL, NULL, 1 },
+  { N_("Vertical Orientation"), zigzagline_vertical_callback, NULL, 1 },
+  { N_("Horizontal Orientation"), zigzagline_horizontal_callback, NULL, 1 }
 };
 
 static DiaMenu object_menu = {
diff -ur dia-0.88.1/po/en_GB.po dia-0.88.1mv/po/en_GB.po
--- dia-0.88.1/po/en_GB.po	Sat May 19 16:34:47 2001
+++ dia-0.88.1mv/po/en_GB.po	Sun Aug 25 16:20:00 2002
@@ -201,7 +201,7 @@
 #: app/dia-props.c:189
 #, fuzzy
 msgid "Background Colour"
-msgstr "Background colour:"
+msgstr "Background Colour:"
 
 #: app/dia-props.c:200 lib/diagramdata.c:59
 msgid "Background"
Only in dia-0.88.1/sheets: sheet-translation-report


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index] Mail converted by Mofo Magic and the Flying D

 
All trademarks and copyrights are the property of their respective owners.

Other Directory Sites: SeekWonder | Directory Owners Forum

GuideSMACK