/* --------------------------------------------------------------------------- * moves a polygon between layers */ static void * MovePolygonToLayer (LayerType *Layer, PolygonType *Polygon) { PolygonTypePtr newone; struct mptlc d; if (TEST_FLAG (LOCKFLAG, Polygon)) { Message (_("Sorry, the object is locked\n")); return NULL; } if (((long int) Dest == -1) || (Layer == Dest)) return (Polygon); AddObjectToMoveToLayerUndoList (POLYGON_TYPE, Layer, Polygon, Polygon); if (Layer->On) ErasePolygon (Polygon); /* Move all of the thermals with the polygon */ d.snum = GetLayerNumber (PCB->Data, Layer); d.dnum = GetLayerNumber (PCB->Data, Dest); d.polygon = Polygon; d.type = PIN_TYPE; r_search (PCB->Data->pin_tree, &Polygon->BoundingBox, NULL, mptl_pin_callback, &d); d.type = VIA_TYPE; r_search (PCB->Data->via_tree, &Polygon->BoundingBox, NULL, mptl_pin_callback, &d); newone = (struct polygon_st *)MovePolygonToLayerLowLevel (Layer, Polygon, Dest); InitClip (PCB->Data, Dest, newone); if (Dest->On) { DrawPolygon (Dest, newone); Draw (); } return (newone); }
void EraseObject (int type, void *lptr, void *ptr) { switch (type) { case VIA_TYPE: case PIN_TYPE: ErasePin ((PinType *) ptr); break; case TEXT_TYPE: case ELEMENTNAME_TYPE: EraseText ((LayerType *)lptr, (TextType *) ptr); break; case POLYGON_TYPE: ErasePolygon ((PolygonType *) ptr); break; case ELEMENT_TYPE: EraseElement ((ElementType *) ptr); break; case LINE_TYPE: case ELEMENTLINE_TYPE: case RATLINE_TYPE: EraseLine ((LineType *) ptr); break; case PAD_TYPE: ErasePad ((PadType *) ptr); break; case ARC_TYPE: case ELEMENTARC_TYPE: EraseArc ((ArcType *) ptr); break; default: Message ("hace: Internal ERROR, trying to erase an unknown type\n"); } }
/* --------------------------------------------------------------------------- * removes a polygon from a layer */ void * RemovePolygon (LayerTypePtr Layer, PolygonTypePtr Polygon) { /* erase from screen */ if (Layer->On) { ErasePolygon (Polygon); if (!Bulk) Draw (); } MoveObjectToRemoveUndoList (POLYGON_TYPE, Layer, Polygon, Polygon); return NULL; }
/* --------------------------------------------------------------------------- * removes a polygon-point from a polygon */ static void * RemovePolygonPoint (LayerTypePtr Layer, PolygonTypePtr Polygon, PointTypePtr Point) { Cardinal point_idx; Cardinal i; Cardinal contour; Cardinal contour_start, contour_end, contour_points; point_idx = polygon_point_idx (Polygon, Point); contour = polygon_point_contour (Polygon, point_idx); contour_start = (contour == 0) ? 0 : Polygon->HoleIndex[contour - 1]; contour_end = (contour == Polygon->HoleIndexN) ? Polygon->PointN : Polygon->HoleIndex[contour]; contour_points = contour_end - contour_start; if (contour_points <= 3) return RemovePolygonContour (Layer, Polygon, contour); if (Layer->On) ErasePolygon (Polygon); /* insert the polygon-point into the undo list */ AddObjectToRemovePointUndoList (POLYGONPOINT_TYPE, Layer, Polygon, point_idx); r_delete_entry (Layer->polygon_tree, (BoxType *) Polygon); /* remove point from list, keep point order */ for (i = point_idx; i < Polygon->PointN - 1; i++) Polygon->Points[i] = Polygon->Points[i + 1]; Polygon->PointN--; /* Shift down indices of any holes */ for (i = 0; i < Polygon->HoleIndexN; i++) if (Polygon->HoleIndex[i] > point_idx) Polygon->HoleIndex[i]--; SetPolygonBoundingBox (Polygon); r_insert_entry (Layer->polygon_tree, (BoxType *) Polygon, 0); RemoveExcessPolygonPoints (Layer, Polygon); InitClip (PCB->Data, Layer, Polygon); /* redraw polygon if necessary */ if (Layer->On) { DrawPolygon (Layer, Polygon); if (!Bulk) Draw (); } return NULL; }
/* --------------------------------------------------------------------------- * inserts a point into a polygon */ static void * InsertPointIntoPolygon (LayerTypePtr Layer, PolygonTypePtr Polygon) { PointType save; Cardinal n; LineType line; if (!Forcible) { /* * first make sure adding the point is sensible */ line.Thickness = 0; line.Point1 = Polygon->Points[prev_contour_point (Polygon, InsertAt)]; line.Point2 = Polygon->Points[InsertAt]; if (IsPointOnLine ((float) InsertX, (float) InsertY, 0.0, &line)) return (NULL); } /* * second, shift the points up to make room for the new point */ ErasePolygon (Polygon); r_delete_entry (Layer->polygon_tree, (BoxTypePtr) Polygon); save = *CreateNewPointInPolygon (Polygon, InsertX, InsertY); for (n = Polygon->PointN - 1; n > InsertAt; n--) Polygon->Points[n] = Polygon->Points[n - 1]; /* Shift up indices of any holes */ for (n = 0; n < Polygon->HoleIndexN; n++) if (Polygon->HoleIndex[n] > InsertAt || (InsertLast && Polygon->HoleIndex[n] == InsertAt)) Polygon->HoleIndex[n]++; Polygon->Points[InsertAt] = save; SetChangedFlag (true); AddObjectToInsertPointUndoList (POLYGONPOINT_TYPE, Layer, Polygon, &Polygon->Points[InsertAt]); SetPolygonBoundingBox (Polygon); r_insert_entry (Layer->polygon_tree, (BoxType *) Polygon, 0); InitClip (PCB->Data, Layer, Polygon); if (Forcible || !RemoveExcessPolygonPoints (Layer, Polygon)) { DrawPolygon (Layer, Polygon, 0); Draw (); } return (&Polygon->Points[InsertAt]); }
/* --------------------------------------------------------------------------- * removes a contour from a polygon. * If removing the outer contour, it removes the whole polygon. */ static void * RemovePolygonContour (LayerTypePtr Layer, PolygonTypePtr Polygon, Cardinal contour) { Cardinal contour_start, contour_end, contour_points; Cardinal i; if (contour == 0) return RemovePolygon (Layer, Polygon); if (Layer->On) { ErasePolygon (Polygon); if (!Bulk) Draw (); } /* Copy the polygon to the undo list */ AddObjectToRemoveContourUndoList (POLYGON_TYPE, Layer, Polygon); contour_start = (contour == 0) ? 0 : Polygon->HoleIndex[contour - 1]; contour_end = (contour == Polygon->HoleIndexN) ? Polygon->PointN : Polygon->HoleIndex[contour]; contour_points = contour_end - contour_start; /* remove points from list, keep point order */ for (i = contour_start; i < Polygon->PointN - contour_points; i++) Polygon->Points[i] = Polygon->Points[i + contour_points]; Polygon->PointN -= contour_points; /* remove hole from list and shift down remaining indices */ for (i = contour; i < Polygon->HoleIndexN; i++) Polygon->HoleIndex[i - 1] = Polygon->HoleIndex[i] - contour_points; Polygon->HoleIndexN--; InitClip (PCB->Data, Layer, Polygon); /* redraw polygon if necessary */ if (Layer->On) { DrawPolygon (Layer, Polygon); if (!Bulk) Draw (); } return NULL; }
/* --------------------------------------------------------------------------- * moves a polygon */ static void * MovePolygon (LayerTypePtr Layer, PolygonTypePtr Polygon) { if (Layer->On) { ErasePolygon (Polygon); } r_delete_entry (Layer->polygon_tree, (BoxType *)Polygon); MovePolygonLowLevel (Polygon, DeltaX, DeltaY); r_insert_entry (Layer->polygon_tree, (BoxType *)Polygon, 0); InitClip (PCB->Data, Layer, Polygon); if (Layer->On) { DrawPolygon (Layer, Polygon); Draw (); } return (Polygon); }
/* --------------------------------------------------------------------------- * moves a polygon-point */ static void * MovePolygonPoint (LayerTypePtr Layer, PolygonTypePtr Polygon, PointTypePtr Point) { if (Layer->On) { ErasePolygon (Polygon); } r_delete_entry (Layer->polygon_tree, (BoxType *)Polygon); MOVE (Point->X, Point->Y, DeltaX, DeltaY); SetPolygonBoundingBox (Polygon); r_insert_entry (Layer->polygon_tree, (BoxType *)Polygon, 0); RemoveExcessPolygonPoints (Layer, Polygon); InitClip (PCB->Data, Layer, Polygon); if (Layer->On) { DrawPolygon (Layer, Polygon); Draw (); } return (Point); }