Index: trunk/src/obj_arc.c =================================================================== --- trunk/src/obj_arc.c (revision 5206) +++ trunk/src/obj_arc.c (revision 5207) @@ -36,6 +36,7 @@ #include "rotate.h" #include "move.h" #include "conf_core.h" +#include "compat_misc.h" #include "obj_arc.h" #include "obj_arc_op.h" @@ -237,6 +238,21 @@ pcb_hash_coord(a->StartAngle) ^ pcb_hash_coord(a->Delta); } +pcb_coord_t pcb_arc_length(const pcb_arc_t *arc) +{ + double da = pcb_normalize_angle(arc->Delta); + double r = (arc->Width + arc->Height) / 2.0; /* TODO: lame approximation */ + return pcb_round(2.0*r*M_PI*da/360.0); +} + +pcb_coord_t pcb_arc_area(const pcb_arc_t *arc) +{ + return + pcb_arc_length(arc) * arc->Thickness /* body */ + + arc->Thickness * arc->Thickness * M_PI; /* cap circles */ +} + + /***** operations *****/ /* copies an arc to buffer */ Index: trunk/src/obj_arc.h =================================================================== --- trunk/src/obj_arc.h (revision 5206) +++ trunk/src/obj_arc.h (revision 5207) @@ -52,7 +52,6 @@ void pcb_add_arc_on_layer(pcb_layer_t *Layer, pcb_arc_t *Arc); - /*** Utility ***/ void pcb_arc_bbox(pcb_arc_t *Arc); void pcb_arc_rotate90(pcb_arc_t *Arc, pcb_coord_t X, pcb_coord_t Y, unsigned Number); @@ -67,6 +66,11 @@ void pcb_arc_set_angles(pcb_layer_t *Layer, pcb_arc_t *a, pcb_angle_t new_sa, pcb_angle_t new_da); void pcb_arc_set_radii(pcb_layer_t *Layer, pcb_arc_t *a, pcb_coord_t new_width, pcb_coord_t new_height); +pcb_coord_t pcb_arc_length(const pcb_arc_t *arc); +pcb_coord_t pcb_arc_area(const pcb_arc_t *arc); + + + #define pcb_arc_move(a,dx,dy) \ do { \ pcb_coord_t __dx__ = (dx), __dy__ = (dy); \