Code Example 1.
In the following example we are going to use QisLib and QisBool to extract a window of polygons from a GDSII file and then clip the extracted polygons and booleanize the polygons. We assume the user has written some functions already to obtain: |
directory to the libraries the gdsii file to open |
the structure to open the layer(s) to process |
the selection window the clipping window |
The Sample Code |
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "qislib.h" #include "qisbool.h" |
Include the basic Microsoft headers and the headers specific to QisLib and QisBool |
/* User driven input functions */ 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*); |
Assume you have written functions to collect the following: directory containing client program (and acs.key) path & name of the user program GDSII File name function to select structure string containing the structure name function to set layers layer list function to set extraction window extraction window coordinates function to get clipping window clipping window coordinates |
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; } |
Our main function to extract and booleanize starts here. Check: Windows or Unix/Linux Initialize for Windows Initialize for Unix/Linux Check for error initializing possibly can't get a license? |
int err = 0; int storageHandle = -1; void* boolHandle = 0; int** XYOut = 0; int* NVOut = 0; int NOut = 0; |
Initialize some variables error indicator handle for Qstore instance handle for QisBool instance array of array of polygon data array of polygon vertex count number of output polygons |
do { /* Open GDSII file */ ret = QisLib_OpenGDSII(User_GDSIIFile()); if(ret) { fprintf(stderr, "QisLib_OpenGDSII returned %d.\n", ret); err = 1; break; } /* Set View Structure */ if(User_OpenStructure()) { ret = QisLib_OpenStructure(User_ViewStructure()); if(ret) { fprintf(stderr, "QisLib_OpenStructure returned %d.\n", ret); err = 1; break; } } /* Set Layers */ if(User_SetLayers()) { QisLib_SetLayersOff("ALL"); QisLib_SetLayersOn(User_LayerString()); } /* Set Window of interest */ if(User_SetWindow()) { CQisWindow win; User_GetWindow(&win); QisLib_SetExactWindow(win); } |
We use a do loop of one pass to insure that even if an error knocks us out of the loop we still execute code outside the loop that cleans up. Our user function provides the name of the file to open. Our user function passes the name of the structure to open (if not, the top structure is automatically chosen. Our user function provides the list of layers to process. (If not, all layers are processed by default) Our user function passes the window coordinates for extracting data. |
NEXT PAGE --> |