43 } gerb_translation_entry_t;
75 image->
info->min_x = HUGE_VAL;
76 image->
info->min_y = HUGE_VAL;
77 image->
info->max_x = -HUGE_VAL;
78 image->
info->max_y = -HUGE_VAL;
96 image->
info->type = g_strdup (_(
"unknown"));
98 image->
info->type = g_strdup (type);
101 image->
info->attr_list = NULL;
102 image->
info->n_attr = 0;
115 gerbv_simplified_amacro_t *sam,*sam2;
123 for (i = 0; i < APERTURE_MAX; i++)
125 for (sam = image->
aperture[i]->simplified; sam != NULL; ){
140 free_amacro(image->
amacro);
153 g_free(image->
info->name);
154 g_free(image->
info->type);
155 gerbv_attribute_destroy_HID_attribute (image->
info->attr_list, image->
info->n_attr);
162 for (net = image->
netlist; net != NULL; ) {
165 if (tmp->
cirseg != NULL) {
170 g_string_free (tmp->
label, TRUE);
175 for (layer = image->
layers; layer != NULL; ) {
181 for (state = image->
states; state != NULL; ) {
213 gerb_verify_error_t error = GERB_IMAGE_OK;
217 if (image->
netlist == NULL) error |= GERB_IMAGE_MISSING_NETLIST;
218 if (image->
format == NULL) error |= GERB_IMAGE_MISSING_FORMAT;
219 if (image->
info == NULL) error |= GERB_IMAGE_MISSING_INFO;
231 for (i = 0; i < APERTURE_MAX && image->
aperture[i] == NULL; i++);
232 if (i == APERTURE_MAX) error |= GERB_IMAGE_MISSING_APERTURES;
242 switch (interpolation) {
244 printf(_(
"linearX1"));
247 printf(_(
"linearX10"));
250 printf(_(
"linearX01"));
253 printf(_(
"linearX001"));
256 printf(_(
"CW circular"));
259 printf(_(
"CCW circular"));
262 printf(_(
"polygon area start"));
265 printf(_(
"polygon area end"));
268 printf(_(
"unknown"));
277 printf(_(
"..state off"));
280 printf(_(
"..state on"));
283 printf(_(
"..state flash"));
286 printf(_(
"..state unknown"));
295 gerbv_aperture_t *
const* aperture;
299 printf(_(
"Apertures:\n"));
301 for (i = 0; i < APERTURE_MAX; i++) {
303 printf(_(
" Aperture no:%d is an "), i);
304 switch(aperture[i]->type) {
309 printf(_(
"rectangle"));
315 printf(_(
"polygon"));
321 printf(_(
"unknown"));
323 for (j = 0; j < aperture[i]->nuf_parameters; j++) {
324 printf(
" %f", aperture[i]->parameter[j]);
333 printf(_(
"(%f,%f)->(%f,%f) with %d ("), net->
start_x, net->
start_y,
348 *newLayer = *previousLayer;
349 previousLayer->
next = newLayer;
351 newLayer->
knockout.firstInstance = FALSE;
352 newLayer->
next = NULL;
363 *newState = *previousState;
364 previousState->
next = newState;
367 newState->
next = NULL;
376 *newLayer = *oldLayer;
377 newLayer->
name = g_strdup (oldLayer->
name);
385 *newState = *oldState;
390 gerbv_image_duplicate_aperture (gerbv_aperture_t *oldAperture){
391 gerbv_aperture_t *newAperture = g_new0 (gerbv_aperture_t,1);
392 gerbv_simplified_amacro_t *simplifiedMacro, *tempSimplified;
394 *newAperture = *oldAperture;
398 newAperture->amacro = NULL;
399 newAperture->simplified = NULL;
402 tempSimplified = NULL;
403 for (simplifiedMacro = oldAperture->simplified; simplifiedMacro != NULL; simplifiedMacro = simplifiedMacro->next) {
404 gerbv_simplified_amacro_t *newSimplified = g_new0 (gerbv_simplified_amacro_t,1);
405 *newSimplified = *simplifiedMacro;
407 tempSimplified->next = newSimplified;
409 newAperture->simplified = newSimplified;
410 tempSimplified = newSimplified;
418 GArray *translationTable){
424 oldLayer = sourceImage->
layers;
425 oldState = sourceImage->
states;
427 newSavedLayer = lastLayer;
428 newSavedState = lastState;
429 newSavedNet = lastNet;
431 for (currentNet = sourceImage->
netlist; currentNet; currentNet = currentNet->
next){
433 if (currentNet->
layer != oldLayer) {
434 newSavedLayer->
next = gerbv_image_duplicate_layer (currentNet->
layer);
435 newSavedLayer = newSavedLayer->
next;
438 if (currentNet->
state != oldState) {
439 newSavedState->
next = gerbv_image_duplicate_state (currentNet->
state);
440 newSavedState = newSavedState->
next;
444 *newNet = *currentNet;
447 newNet->
cirseg = g_new (gerbv_cirseg_t,1);
451 if (currentNet->
label)
452 newNet->
label = g_string_new(currentNet->
label->str);
454 newNet->
state = newSavedState;
455 newNet->
layer = newSavedLayer;
457 if (translationTable) {
458 for (i=0; i<translationTable->len; i++){
459 gerb_translation_entry_t translationEntry=g_array_index (translationTable, gerb_translation_entry_t, i);
461 if (translationEntry.oldAperture == newNet->
aperture) {
462 newNet->
aperture = translationEntry.newAperture;
479 newSavedNet->
next = newNet;
482 newSavedNet = newNet;
488 gerbv_image_find_existing_aperture_match (gerbv_aperture_t *checkAperture,
gerbv_image_t *imageToSearch) {
492 for (i = 0; i < APERTURE_MAX; i++) {
493 if (imageToSearch->
aperture[i] != NULL) {
494 if ((imageToSearch->
aperture[i]->type == checkAperture->type) &&
495 (imageToSearch->
aperture[i]->simplified == NULL) &&
496 (imageToSearch->
aperture[i]->unit == checkAperture->unit)) {
499 for (j=0; j<APERTURE_PARAMETERS_MAX; j++){
500 if (imageToSearch->
aperture[i]->parameter[j] != checkAperture->parameter[j])
512 gerbv_image_find_unused_aperture_number (
int startIndex,
gerbv_image_t *image){
515 for (i = startIndex; i < APERTURE_MAX; i++) {
527 int lastUsedApertureNumber = APERTURE_MIN - 1;
528 GArray *apertureNumberTable = g_array_new(FALSE,FALSE,
sizeof(gerb_translation_entry_t));
532 *(newImage->
info) = *(sourceImage->
info);
533 newImage->
info->name = g_strdup (sourceImage->
info->name);
534 newImage->
info->type = g_strdup (sourceImage->
info->type);
535 newImage->
info->plotterFilm = g_strdup (sourceImage->
info->plotterFilm);
536 newImage->
info->attr_list = gerbv_attribute_dup (sourceImage->
info->attr_list,
537 sourceImage->
info->n_attr);
541 for (i = 0; i < APERTURE_MAX; i++) {
542 if (sourceImage->
aperture[i] != NULL) {
543 gerbv_aperture_t *newAperture = gerbv_image_duplicate_aperture (sourceImage->
aperture[i]);
545 lastUsedApertureNumber = gerbv_image_find_unused_aperture_number (lastUsedApertureNumber + 1, newImage);
547 gerb_translation_entry_t translationEntry={i,lastUsedApertureNumber};
548 g_array_append_val (apertureNumberTable,translationEntry);
550 newImage->
aperture[lastUsedApertureNumber] = newAperture;
556 gerbv_image_copy_all_nets (sourceImage, newImage, newImage->
layers, newImage->
states, NULL, transform, apertureNumberTable);
557 g_array_free (apertureNumberTable, TRUE);
563 int lastUsedApertureNumber = APERTURE_MIN - 1;
565 GArray *apertureNumberTable = g_array_new(FALSE,FALSE,
sizeof(gerb_translation_entry_t));
568 for (i = 0; i < APERTURE_MAX; i++) {
569 if (sourceImage->
aperture[i] != NULL) {
570 gint existingAperture = gerbv_image_find_existing_aperture_match (sourceImage->
aperture[i], destinationImage);
574 if (existingAperture > 0) {
575 gerb_translation_entry_t translationEntry={i,existingAperture};
576 g_array_append_val (apertureNumberTable,translationEntry);
580 gerbv_aperture_t *newAperture = gerbv_image_duplicate_aperture (sourceImage->
aperture[i]);
582 lastUsedApertureNumber = gerbv_image_find_unused_aperture_number (lastUsedApertureNumber + 1, destinationImage);
584 gerb_translation_entry_t translationEntry={i,lastUsedApertureNumber};
585 g_array_append_val (apertureNumberTable,translationEntry);
587 destinationImage->
aperture[lastUsedApertureNumber] = newAperture;
596 for (lastState = destinationImage->
states; lastState->
next; lastState=lastState->
next){}
597 for (lastLayer = destinationImage->
layers; lastLayer->
next; lastLayer=lastLayer->
next){}
598 for (lastNet = destinationImage->
netlist; lastNet->
next; lastNet=lastNet->
next){}
601 gerbv_image_copy_all_nets (sourceImage, destinationImage, lastLayer, lastState, lastNet, transform, apertureNumberTable);
602 g_array_free (apertureNumberTable, TRUE);
609 g_assert (currentNet);
617 for (tempNet = currentNet->
next; tempNet; tempNet = tempNet->
next){
636 gerbv_image_delete_selected_nets (
gerbv_image_t *sourceImage, GArray *selectedNodeArray) {
640 for (currentNet = sourceImage->
netlist; currentNet; currentNet = currentNet->
next){
641 for (i=0; i<selectedNodeArray->len; i++){
642 gerbv_selection_item_t sItem = g_array_index (selectedNodeArray,
643 gerbv_selection_item_t, i);
644 if (sItem.net == currentNet) {
654 gdouble coordinateY, gdouble width, gdouble height) {
658 for (currentNet = image->
netlist; currentNet->
next; currentNet = currentNet->
next){}
661 currentNet = gerber_create_new_net (currentNet, NULL, NULL);
665 currentNet = gerber_create_new_net (currentNet, NULL, NULL);
668 currentNet->
start_x = coordinateX;
669 currentNet->
start_y = coordinateY;
670 currentNet->
stop_x = coordinateX;
671 currentNet->
stop_y = coordinateY;
674 currentNet = gerber_create_new_net (currentNet, NULL, NULL);
677 currentNet->
start_x = coordinateX;
678 currentNet->
start_y = coordinateY;
679 currentNet->
stop_x = coordinateX + width;
680 currentNet->
stop_y = coordinateY;
683 gerber_update_image_min_max (¤tNet->
boundingBox, 0, 0, image);
685 currentNet = gerber_create_new_net (currentNet, NULL, NULL);
688 currentNet->
stop_x = coordinateX + width;
689 currentNet->
stop_y = coordinateY + height;
692 gerber_update_image_min_max (¤tNet->
boundingBox, 0, 0, image);
694 currentNet = gerber_create_new_net (currentNet, NULL, NULL);
697 currentNet->
stop_x = coordinateX;
698 currentNet->
stop_y = coordinateY + height;
701 gerber_update_image_min_max (¤tNet->
boundingBox, 0, 0, image);
703 currentNet = gerber_create_new_net (currentNet, NULL, NULL);
706 currentNet->
stop_x = coordinateX;
707 currentNet->
stop_y = coordinateY;
710 gerber_update_image_min_max (¤tNet->
boundingBox, 0, 0, image);
713 currentNet = gerber_create_new_net (currentNet, NULL, NULL);
720 gerb_image_return_aperture_index (
gerbv_image_t *image, gdouble lineWidth,
int *apertureIndex){
722 gerbv_aperture_t *aperture=NULL;
726 for (currentNet = image->
netlist; currentNet->
next; currentNet = currentNet->
next){}
729 for (i = 0; i < APERTURE_MAX; i++) {
732 (fabs (image->
aperture[i]->parameter[0] - lineWidth) < 0.001)){
742 if (!gerber_create_new_aperture (image, apertureIndex,
753 gdouble radius, gdouble startAngle, gdouble endAngle, gdouble lineWidth,
757 gerbv_cirseg_t cirSeg = {centerX, centerY, radius, radius, startAngle, endAngle};
759 currentNet = gerb_image_return_aperture_index(image, lineWidth, &apertureIndex);
765 currentNet = gerber_create_new_net (currentNet, NULL, NULL);
768 currentNet->
aperture = apertureIndex;
769 currentNet->
start_x = centerX + (cos(startAngle*M_PI/180) * radius);
770 currentNet->
start_y = centerY + (sin(startAngle*M_PI/180) * radius);
771 currentNet->
stop_x = centerX + (cos(endAngle*M_PI/180) * radius);
772 currentNet->
stop_y = centerY + (sin(endAngle*M_PI/180) * radius);;
773 currentNet->
cirseg = g_new0 (gerbv_cirseg_t,1);
774 *(currentNet->
cirseg) = cirSeg;
776 gdouble angleDiff = currentNet->
cirseg->angle2 - currentNet->
cirseg->angle1;
777 gint i, steps = abs(angleDiff);
778 for (i=0; i<=steps; i++){
779 gdouble tempX = currentNet->
cirseg->cp_x + currentNet->
cirseg->width / 2.0 *
780 cos ((currentNet->
cirseg->angle1 +
781 (angleDiff * i) / steps)*M_PI/180);
782 gdouble tempY = currentNet->
cirseg->cp_y + currentNet->
cirseg->width / 2.0 *
783 sin ((currentNet->
cirseg->angle1 +
784 (angleDiff * i) / steps)*M_PI/180);
785 gerber_update_min_and_max (¤tNet->
boundingBox,
787 lineWidth/2,lineWidth/2,
788 lineWidth/2,lineWidth/2);
790 gerber_update_image_min_max (¤tNet->
boundingBox, 0, 0, image);
800 currentNet = gerb_image_return_aperture_index(image, lineWidth, &apertureIndex);
806 currentNet = gerber_create_new_net (currentNet, NULL, NULL);
810 if ((fabs(startX - endX) < 0.001) && (fabs(startY - endY) < 0.001))
814 currentNet->
aperture = apertureIndex;
817 currentNet->
stop_x = endX;
818 currentNet->
stop_y = endY;
821 lineWidth/2,lineWidth/2,lineWidth/2,lineWidth/2);
823 lineWidth/2,lineWidth/2,lineWidth/2,lineWidth/2);
824 gerber_update_image_min_max (¤tNet->
boundingBox, 0, 0, image);
829 gerbv_image_create_window_pane_objects (
gerbv_image_t *image, gdouble lowerLeftX,
830 gdouble lowerLeftY, gdouble width, gdouble height, gdouble areaReduction,
831 gint paneRows, gint paneColumns, gdouble paneSeparation){
833 gdouble startX,startY,boxWidth,boxHeight;
835 startX = lowerLeftX + (areaReduction * width) / 2.0;
836 startY = lowerLeftY + (areaReduction * height) / 2.0;
837 boxWidth = (width * (1.0 - areaReduction) - (paneSeparation * (paneColumns - 1))) / paneColumns;
838 boxHeight = (height * (1.0 - areaReduction) - (paneSeparation * (paneRows - 1))) / paneRows;
840 for (i=0; i<paneColumns; i++){
841 for (j=0; j<paneRows; j++) {
843 startY + (j * (boxHeight + paneSeparation)),boxWidth, boxHeight);
851 gerbv_image_reduce_area_of_selected_objects (GArray *selectionArray,
852 gdouble areaReduction, gint paneRows, gint paneColumns, gdouble paneSeparation){
854 gdouble minX,minY,maxX,maxY;
856 for (i=0; i<selectionArray->len; i++) {
857 gerbv_selection_item_t sItem = g_array_index (selectionArray,gerbv_selection_item_t, i);
871 for (currentNet = currentNet->
next; currentNet; currentNet = currentNet->
next){
875 if (currentNet->
stop_x < minX)
876 minX = currentNet->
stop_x;
877 if (currentNet->
stop_y < minY)
878 minY = currentNet->
stop_y;
879 if (currentNet->
stop_x > maxX)
880 maxX = currentNet->
stop_x;
881 if (currentNet->
stop_y > maxY)
882 maxY = currentNet->
stop_y;
905 if (currentNet->
start_x-dx < minX)
907 if (currentNet->
start_y-dy < minY)
909 if (currentNet->
start_x+dx > maxX)
911 if (currentNet->
start_y+dy > maxY)
914 if (currentNet->
stop_x-dx < minX)
915 minX = currentNet->
stop_x-dx;
916 if (currentNet->
stop_y-dy < minY)
917 minY = currentNet->
stop_y-dy;
918 if (currentNet->
stop_x+dx > maxX)
919 maxX = currentNet->
stop_x+dx;
920 if (currentNet->
stop_y+dy > maxY)
921 maxY = currentNet->
stop_y+dy;
931 gerbv_image_create_window_pane_objects (image, minX, minY, maxX - minX, maxY - minY,
932 areaReduction, paneRows, paneColumns, paneSeparation);
938 gerbv_image_move_selected_objects (GArray *selectionArray, gdouble translationX,
939 gdouble translationY) {
942 for (i=0; i<selectionArray->len; i++) {
943 gerbv_selection_item_t sItem = g_array_index (selectionArray,gerbv_selection_item_t, i);
948 for (currentNet = currentNet->
next; currentNet; currentNet = currentNet->
next){
951 currentNet->
start_x += translationX;
952 currentNet->
start_y += translationY;
953 currentNet->
stop_x += translationX;
954 currentNet->
stop_y += translationY;
959 currentNet->
start_x += translationX;
960 currentNet->
start_y += translationY;
961 currentNet->
stop_x += translationX;
962 currentNet->
stop_y += translationY;
974 for (currentNet = currentNet->
next; currentNet; currentNet = currentNet->
next){
976 return currentNet->
next;
982 return currentNet->
next;
991 for (currentNet = parsed_image->
netlist; currentNet->
next; currentNet = currentNet->
next){
993 parsed_image->
aperture[currentNet->
aperture] = g_new0 (gerbv_aperture_t, 1);