static void move_one_thermal (int old_index, int new_index, PinType *pin) { int t1=0, i; int oi=old_index, ni=new_index; if (old_index != -1) t1 = GET_THERM (old_index, pin); if (oi == -1) oi = MAX_LAYER-1; /* inserting a layer */ if (ni == -1) ni = MAX_LAYER-1; /* deleting a layer */ if (oi < ni) { for (i=oi; i<ni; i++) ASSIGN_THERM (i, GET_THERM (i+1, pin), pin); } else { for (i=oi; i>ni; i--) ASSIGN_THERM (i, GET_THERM (i-1, pin), pin); } if (new_index != -1) ASSIGN_THERM (new_index, t1, pin); else ASSIGN_THERM (ni, 0, pin); }
int mptl_pin_callback (const BoxType *b, void *cl) { struct mptlc *d = (struct mptlc *) cl; PinTypePtr pin = (PinTypePtr) b; if (!TEST_THERM (d->snum, pin) || ! IsPointInPolygon (pin->X, pin->Y, pin->Thickness + pin->Clearance + 2, d->polygon)) return 0; if (d->type == PIN_TYPE) AddObjectToFlagUndoList (PIN_TYPE, pin->Element, pin, pin); else AddObjectToFlagUndoList (VIA_TYPE, pin, pin, pin); ASSIGN_THERM (d->dnum, GET_THERM (d->snum, pin), pin); CLEAR_THERM (d->snum, pin); return 1; }
/* ThermPoly returns a POLYAREA having all of the clearance that when * subtracted from the plane create the desired thermal fingers. * Usually this is 4 disjoint regions. * */ POLYAREA * ThermPoly (PCBTypePtr p, PinTypePtr pin, Cardinal laynum) { ArcType a; POLYAREA *pa, *arc; Cardinal style = GET_THERM (laynum, pin); if (style == 3) return NULL; /* solid connection no clearance */ pcb = p; if (TEST_FLAG (SQUAREFLAG, pin)) return square_therm (pin, style); if (TEST_FLAG (OCTAGONFLAG, pin)) return oct_therm (pin, style); /* must be circular */ switch (style) { case 1: case 2: { POLYAREA *m; Coord t = (pin->Thickness + pin->Clearance) / 2; Coord w = 0.5 * pcb->ThermScale * pin->Clearance; pa = CirclePoly (pin->X, pin->Y, t); arc = CirclePoly (pin->X, pin->Y, pin->Thickness / 2); /* create a thin ring */ poly_Boolean_free (pa, arc, &m, PBO_SUB); /* fix me needs error checking */ if (style == 2) { /* t is the theoretically required length, but we use twice that * to avoid descritisation errors in our circle approximation. */ pa = RectPoly (pin->X - t * 2, pin->X + t * 2, pin->Y - w, pin->Y + w); poly_Boolean_free (m, pa, &arc, PBO_SUB); pa = RectPoly (pin->X - w, pin->X + w, pin->Y - t * 2, pin->Y + t * 2); } else { /* t is the theoretically required length, but we use twice that * to avoid descritisation errors in our circle approximation. */ pa = diag_line (pin->X, pin->Y, t * 2, w, true); poly_Boolean_free (m, pa, &arc, PBO_SUB); pa = diag_line (pin->X, pin->Y, t * 2, w, false); } poly_Boolean_free (arc, pa, &m, PBO_SUB); return m; } default: a.X = pin->X; a.Y = pin->Y; a.Height = a.Width = pin->Thickness / 2 + pin->Clearance / 4; a.Thickness = 1; a.Clearance = pin->Clearance / 2; a.Flags = NoFlags (); a.Delta = 90 - (a.Clearance * (1. + 2. * pcb->ThermScale) * 180) / (M_PI * a.Width); a.StartAngle = 90 - a.Delta / 2 + (style == 4 ? 0 : 45); pa = ArcPoly (&a, a.Clearance); if (!pa) return NULL; a.StartAngle += 90; arc = ArcPoly (&a, a.Clearance); if (!arc) return NULL; pa->f = arc; arc->b = pa; a.StartAngle += 90; arc = ArcPoly (&a, a.Clearance); if (!arc) return NULL; pa->f->f = arc; arc->b = pa->f; a.StartAngle += 90; arc = ArcPoly (&a, a.Clearance); if (!arc) return NULL; pa->b = arc; pa->f->f->f = arc; arc->b = pa->f->f; arc->f = pa; pa->b = arc; return pa; } }
static char * common_flags_to_string (FlagType flags, int object_type, FlagBitsType *flagbits, int n_flagbits) { int len; int i; FlagHolder fh, savef; char *buf, *bp; fh.Flags = flags; #ifndef FLAG_TEST switch (object_type) { case VIA_TYPE: CLEAR_FLAG (VIAFLAG, &fh); break; case RATLINE_TYPE: CLEAR_FLAG (RATFLAG, &fh); break; case PIN_TYPE: CLEAR_FLAG (PINFLAG, &fh); break; } #endif savef = fh; len = 3; /* for "()\0" */ for (i = 0; i < n_flagbits; i++) if ((flagbits[i].object_types & object_type) && (TEST_FLAG (flagbits[i].mask, &fh))) { len += flagbits[i].nlen + 1; CLEAR_FLAG (flagbits[i].mask, &fh); } if (TEST_ANY_THERMS (&fh)) { len += sizeof ("thermal()"); for (i = 0; i < MAX_LAYER; i++) if (TEST_THERM (i, &fh)) len += printed_int_length (i, GET_THERM (i, &fh)) + 1; } bp = buf = alloc_buf (len + 2); *bp++ = '"'; fh = savef; for (i = 0; i < n_flagbits; i++) if (flagbits[i].object_types & object_type && (TEST_FLAG (flagbits[i].mask, &fh))) { if (bp != buf + 1) *bp++ = ','; strcpy (bp, flagbits[i].name); bp += flagbits[i].nlen; CLEAR_FLAG (flagbits[i].mask, &fh); } if (TEST_ANY_THERMS (&fh)) { if (bp != buf + 1) *bp++ = ','; strcpy (bp, "thermal"); bp += strlen ("thermal"); grow_layer_list (0); for (i = 0; i < MAX_LAYER; i++) if (TEST_THERM (i, &fh)) set_layer_list (i, GET_THERM (i, &fh)); strcpy (bp, print_layer_list ()); bp += strlen (bp); } *bp++ = '"'; *bp = 0; return buf; }
static char * common_flags_to_string (FlagType flags, int object_type, FlagBitsType *flagbits, int n_flagbits) { int len; int i; FlagHolder fh, savef; char *buf, *bp; unknown_flag_t *u; fh.Flags = flags; #ifndef FLAG_TEST switch (object_type) { case VIA_TYPE: CLEAR_FLAG (VIAFLAG, &fh); break; case RATLINE_TYPE: CLEAR_FLAG (RATFLAG, &fh); break; case PIN_TYPE: CLEAR_FLAG (PINFLAG, &fh); break; } #endif savef = fh; len = 3; /* for "()\0" */ for (i = 0; i < n_flagbits; i++) if ((flagbits[i].object_types & object_type) && (TEST_FLAG (flagbits[i].mask, &fh))) { len += flagbits[i].nlen + 1; CLEAR_FLAG (flagbits[i].mask, &fh); } if (TEST_ANY_THERMS (&fh)) { len += sizeof ("thermal()"); for (i = 0; i < MAX_LAYER; i++) if (TEST_THERM (i, &fh)) len += printed_int_length (i, GET_THERM (i, &fh)) + 1; } if (flags.q > 0) { len += sizeof ("shape(.)"); if (flags.q > 9) len+=2; } if (flags.int_conn_grp > 0) { len += sizeof ("intconn(.)"); if (flags.q > 9) len++; if (flags.q > 99) len++; } for(u = flags.unknowns; u != NULL; u = u->next) len += strlen(u->str)+1; bp = buf = alloc_buf (len + 2); *bp++ = '"'; fh = savef; for (i = 0; i < n_flagbits; i++) if (flagbits[i].object_types & object_type && (TEST_FLAG (flagbits[i].mask, &fh))) { if (bp != buf + 1) *bp++ = ','; strcpy (bp, flagbits[i].name); bp += flagbits[i].nlen; CLEAR_FLAG (flagbits[i].mask, &fh); } if (TEST_ANY_THERMS (&fh)) { if (bp != buf + 1) *bp++ = ','; strcpy (bp, "thermal"); bp += strlen ("thermal"); grow_layer_list (0); for (i = 0; i < MAX_LAYER; i++) if (TEST_THERM (i, &fh)) set_layer_list (i, GET_THERM (i, &fh)); strcpy (bp, print_layer_list ()); bp += strlen (bp); } if (flags.q > 0) { if (bp != buf + 1) *bp++ = ','; bp += sprintf(bp, "shape(%d)", flags.q); } if (flags.int_conn_grp > 0) { if (bp != buf + 1) *bp++ = ','; bp += sprintf(bp, "intconn(%d)", flags.int_conn_grp); } for(u = flags.unknowns; u != NULL; u = u->next) { int len; len = strlen(u->str); if (bp != buf + 1) *bp++ = ','; memcpy(bp, u->str, len); bp += len; } *bp++ = '"'; *bp = 0; return buf; }