/* --------------------------------------------------------------------------- * copies data from one element to another and creates the destination * if necessary */ ElementType * CopyElementLowLevel (DataType *Data, ElementType *Src, bool uniqueName, Coord dx, Coord dy, int mask_flags) { int i; ElementType *Dest; /* both coordinates and flags are the same */ Dest = CreateNewElement (Data, &PCB->Font, MaskFlags (Src->Flags, mask_flags), DESCRIPTION_NAME (Src), NAMEONPCB_NAME (Src), VALUE_NAME (Src), DESCRIPTION_TEXT (Src).X + dx, DESCRIPTION_TEXT (Src).Y + dy, DESCRIPTION_TEXT (Src).Direction, DESCRIPTION_TEXT (Src).Scale, MaskFlags (DESCRIPTION_TEXT (Src).Flags, mask_flags), uniqueName); /* abort on error */ if (!Dest) return (Dest); ELEMENTLINE_LOOP (Src); { CreateNewLineInElement (Dest, line->Point1.X + dx, line->Point1.Y + dy, line->Point2.X + dx, line->Point2.Y + dy, line->Thickness); } END_LOOP; PIN_LOOP (Src); { CreateNewPin (Dest, pin->X + dx, pin->Y + dy, pin->Thickness, pin->Clearance, pin->Mask, pin->DrillingHole, pin->Name, pin->Number, MaskFlags (pin->Flags, mask_flags)); } END_LOOP; PAD_LOOP (Src); { CreateNewPad (Dest, pad->Point1.X + dx, pad->Point1.Y + dy, pad->Point2.X + dx, pad->Point2.Y + dy, pad->Thickness, pad->Clearance, pad->Mask, pad->Name, pad->Number, MaskFlags (pad->Flags, mask_flags)); } END_LOOP; ARC_LOOP (Src); { CreateNewArcInElement (Dest, arc->X + dx, arc->Y + dy, arc->Width, arc->Height, arc->StartAngle, arc->Delta, arc->Thickness); } END_LOOP; for (i=0; i<Src->Attributes.Number; i++) CreateNewAttribute (& Dest->Attributes, Src->Attributes.List[i].name, Src->Attributes.List[i].value); Dest->MarkX = Src->MarkX + dx; Dest->MarkY = Src->MarkY + dy; SetElementBoundingBox (Data, Dest, &PCB->Font); return (Dest); }
/* --------------------------------------------------------------------------- * writes element data */ static void WriteElementData (FILE * FP, DataTypePtr Data) { GList *n, *p; for (n = Data->Element; n != NULL; n = g_list_next (n)) { ElementType *element = n->data; /* only non empty elements */ if (!element->LineN && !element->PinN && !element->ArcN && !element->PadN) continue; /* the coordinates and text-flags are the same for * both names of an element */ fprintf (FP, "\nElement[%s ", F2S (element, ELEMENT_TYPE)); PrintQuotedString (FP, (char *)EMPTY (DESCRIPTION_NAME (element))); fputc (' ', FP); PrintQuotedString (FP, (char *)EMPTY (NAMEONPCB_NAME (element))); fputc (' ', FP); PrintQuotedString (FP, (char *)EMPTY (VALUE_NAME (element))); pcb_fprintf (FP, " %mr %mr %mr %mr %d %d %s]\n(\n", element->MarkX, element->MarkY, DESCRIPTION_TEXT (element).X - element->MarkX, DESCRIPTION_TEXT (element).Y - element->MarkY, DESCRIPTION_TEXT (element).Direction, DESCRIPTION_TEXT (element).Scale, F2S (&(DESCRIPTION_TEXT (element)), ELEMENTNAME_TYPE)); WriteAttributeList (FP, &element->Attributes, "\t"); for (p = element->Pin; p != NULL; p = g_list_next (p)) { PinType *pin = p->data; pcb_fprintf (FP, "\tPin[%mr %mr %mr %mr %mr %mr ", pin->X - element->MarkX, pin->Y - element->MarkY, pin->Thickness, pin->Clearance, pin->Mask, pin->DrillingHole); PrintQuotedString (FP, (char *)EMPTY (pin->Name)); fprintf (FP, " "); PrintQuotedString (FP, (char *)EMPTY (pin->Number)); fprintf (FP, " %s]\n", F2S (pin, PIN_TYPE)); } for (p = element->Pad; p != NULL; p = g_list_next (p)) { PadType *pad = p->data; pcb_fprintf (FP, "\tPad[%mr %mr %mr %mr %mr %mr %mr ", pad->Point1.X - element->MarkX, pad->Point1.Y - element->MarkY, pad->Point2.X - element->MarkX, pad->Point2.Y - element->MarkY, pad->Thickness, pad->Clearance, pad->Mask); PrintQuotedString (FP, (char *)EMPTY (pad->Name)); fprintf (FP, " "); PrintQuotedString (FP, (char *)EMPTY (pad->Number)); fprintf (FP, " %s]\n", F2S (pad, PAD_TYPE)); } for (p = element->Line; p != NULL; p = g_list_next (p)) { LineType *line = p->data; pcb_fprintf (FP, "\tElementLine [%mr %mr %mr %mr %mr]\n", line->Point1.X - element->MarkX, line->Point1.Y - element->MarkY, line->Point2.X - element->MarkX, line->Point2.Y - element->MarkY, line->Thickness); } for (p = element->Arc; p != NULL; p = g_list_next (p)) { ArcType *arc = p->data; pcb_fprintf (FP, "\tElementArc [%mr %mr %mr %mr %ma %ma %mr]\n", arc->X - element->MarkX, arc->Y - element->MarkY, arc->Width, arc->Height, arc->StartAngle, arc->Delta, arc->Thickness); } fputs ("\n\t)\n", FP); } }