ARTWORK CONVERSION SOFTWARE

GDSII | QISBOOL | Index

 

QisBool Sample Code

Booleanize

Single threaded union of polygons obtained from a single window using QisLib

 

 

 


 

booleanize.cpp

 

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

#include "qislib.h"  ////Include file for QisLib Code

#include "qisbool.h" ////Include file for QisBool Code

 

/* User driven input functions.

 * This information will be provided by the client application

 */

const char* User_ExecDir(const char*);

const char* User_ExecPath(const char*);

const char* User_GDSIIFile();

int User_OpenStructure();

const char* User_ViewStructure();

int User_SetLayers();

const char* User_LayerString();

int User_SetWindow();

void User_GetWindow(CQisWindow*);

int User_SetClipWindow();

void User_ClipWindow(int*, int*, int*, int*);

 

int booleanize_main(int argc, char* argv[])

{

  /* Initialize QisLib */

  #if(defined(WIN32) || defined(WIN64))

  int ret = QisLib_InitLib(User_ExecDir(argv[0]));

  #else

  int ret = QisLib_InitLib(User_ExecPath(argv[0]), NULL, NULL);

  #endif

  if(ret) {

    fprintf(stderr, "error: QisLib_InitLib returned %d.\n", ret);

    if(ret == -3) {

      fprintf(stderr, "License error: %s\n", QisLib_GetErrorMsg());

    }

    return 1;

  }

 

  int err = 0;

  int storageHandle = -1;

  void* boolHandle = 0;

  int** XYOut = 0;

  int* NVOut = 0;

  int NOut = 0;

 

  do {

 

    /* Open a GDSII file */

    ret = QisLib_OpenGDSII(User_GDSIIFile());

    if(ret) {

      fprintf(stderr, "QisLib_OpenGDSII returned %d.\n", ret);

      err = 1; break;

    }

 

    /* If desired, Set view structure otherwise work with the Default top structure */

    if(User_OpenStructure()) {

      ret = QisLib_OpenStructure(User_ViewStructure());

      if(ret) {

        fprintf(stderr, "QisLib_OpenStructure returned %d.\n", ret);

        err = 1; break;

      }

    }

 

    /* If desired, Set certain layers otherwise work with all layers */

    if(User_SetLayers()) {

      QisLib_SetLayersOff("ALL");

      QisLib_SetLayersOn(User_LayerString());

    }

 

    /* If desired, Set a window of interest

     * otherwise work with the extents of the current structure

     */

    if(User_SetWindow()) {

      CQisWindow win;

      User_GetWindow(&win);

      QisLib_SetExactWindow(win);

    }

 

    /* Collect boundaries belonging to the window specified above

     * Convert any paths to boundaries

     */

    QisLib_SetVectorUnit(_QISUNIT_DBU);

    QisLib_SetGetVectorPath(_QISPATH_BNDRY);

 

    longlong N;

    int* NV = 0;

    int** XY = 0;

    storageHandle = QStore_GetDataVectorBoundaries(&N, &XY, &NV);

    if(storageHandle < 0) {

      fprintf(stderr, "QStore_GetDataVectorBoundaries returned %d.", storageHandle);

      err = 1; break;

    }

 

    /* Write input boundaries as text */

    FILE* fptr = fopen("inputpolys.txt", "w");

    if(fptr) {

      fprintf(fptr, "%d\n", (int)(N));

      for(int i=0; i<N; i++) {

        fprintf(fptr, "[%d] ", NV[i]);

        for(int j=0; j<(NV[i]*2); j+=2)

          fprintf(fptr, "%d,%d ", XY[j], XY[j+1]);

        fprintf(fptr, "\n");

      }

      fclose(fptr);

    }

 

    /* Create QisBool instance */

    char errMsg[1024];

    boolHandle = QisBool_Create(errMsg);

    if(!boolHandle) {

      fprintf(stderr, "error: QisBool_Create %s\n", errMsg);

      err = 1; break;

    }

 

    /* If desired, Set clipping window otherwise do not clip the boundaries */

    if(User_SetClipWindow()) {

      int minx, miny, maxx, maxy;

      User_ClipWindow(&minx, &miny, &maxx, &maxy);

      QisBoolOptions_SetClipWindow(minx, miny, maxx, maxy, boolHandle);

    }

 

    /* Set Max. Output vertex count (QisLib allows max. 8190 vertices per polygon) */

    QisBoolOptions_SetMaxPoints(8190, boolHandle);

   

    /* Unionize collected boundaries */

    ret = QisBool_Booleanize(

      eUNION_OPCODE, XY, NV, N, NULL, NULL, 0, &XYOut, &NVOut, &NOut, boolHandle

    );

    if(ret < 0) {

      fprintf(stderr, "error: QisBool_Booleanize %s\n", QisBool_ErrorMsg(ret, boolHandle));

      err = 1; break;

    } else if(ret > 0) {

      fprintf(stderr, "warning: QisBool_Booleanize %s\n", QisBool_ErrorMsg(ret, boolHandle));

    }

 

    /* Write output boundaries as text */

    fptr = fopen("outputpolys.txt", "w");

    if(fptr) {

      fprintf(fptr, "%d\n", (int)(NOut));

      for(int i=0; i<NOut; i++) {

        fprintf(fptr, "[%d] ", NVOut[i]);

        for(int j=0; j<(NVOut[i]*2); j+=2)

          fprintf(fptr, "%d,%d ", XYOut[j], XYOut[j+1]);

        fprintf(fptr, "\n");

      }

      fclose(fptr);

    }

 

  } while(0);

 

  /* Cleanup and Close */

  if((NOut > 0) && NVOut && XYOut) QisBool_Release(&XYOut, &NVOut, &NOut);

  if(boolHandle) QisBool_Destroy(&boolHandle);

  if(storageHandle >= 0) QStore_Release(storageHandle);

  QisLib_CloseLib();

  return err;

}

 

 


 

 

 

© 2012 Artwork Conversion Software Inc.

417 Ingalls St. Santa Cruz CA 95060

[T] +1 831-426-6163 [F] +1 831-[E] info@artwork.com